#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)
Комментариев нет:
Отправить комментарий