Страницы

Поиск по вопросам

вторник, 23 апреля 2019 г.

Передача файла на сервер 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. Где я ошибаюсь?


Ответ

Как выяснили в комментариях, речь о PHP 5.6. Начиная с этой версии загрузка файлов синтаксисом через @ отключена по-умолчанию. Теперь файлы нужно загружать через класс CURLFile, как-то так:
$postdata = array( 'FileToLoad' => new CURLFile($this->file, null /*или mime-type*/, $this->filename), 'fileId' => $this->fileId, );
Код самого запроса остаётся тем же самым.
Как видно, исправляется несложно. Но для полноты ответа добавлю, что для старого кода включить обратно передачу файлов через синтаксис @ пока возможно опцией CURLOPT_SAFE_UPLOAD

Комментариев нет:

Отправить комментарий