Страницы

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

четверг, 13 февраля 2020 г.

Передача файла на сервер CURL

#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)

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

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