#php #curl #файлы
Пытаюсь передать файл на сервер, использую CURL
Запрос формируется так:
$postdata = array(
'FileToLoad' => "@".$this->file."; filename=\"$this->filename\";",
'fileId' => $this->fileId);
$this->file содержит полный путь до файла на сервере /var/www/site/data/www/site.ru/tmp/file.pdf
Отправляю так:
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl,CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_COOKIE, ".ASPXAUTH=$this->token;");
$out = curl_exec($curl);
curl_close($curl);
}
Запрос проходит успешно, но данные попадают в $_POST, а я их очень хочу увидеть в
$_FILES. Где я ошибаюсь?
Ответы
Ответ 1
Как выяснили в комментариях, речь о PHP 5.6. Начиная с этой версии загрузка файлов синтаксисом через @ отключена по-умолчанию. Теперь файлы нужно загружать через класс CURLFile, как-то так: $postdata = array( 'FileToLoad' => new CURLFile($this->file, null /*или mime-type*/, $this->filename), 'fileId' => $this->fileId, ); Код самого запроса остаётся тем же самым. Как видно, исправляется несложно. Но для полноты ответа добавлю, что для старого кода включить обратно передачу файлов через синтаксис @ пока возможно опцией CURLOPT_SAFE_UPLOADОтвет 2
Для поддержки старых версий PHP if (!function_exists('curl_file_create')) { function curl_file_create($filename, $mimetype = '', $postname = '') { if(file_exists($filename)) return "@$filename;filename=" . ($postname ?: basename($filename)) . ($mimetype ? ";type=$mimetype" : ''); else exit('Error! File '.$filename.' not found!'); } } И вызывать: curl_file_create($file)
Комментариев нет:
Отправить комментарий