Intereting Posts
PHP mail: все электронные письма получены в папке SPAM Разметка страницы, чтобы показать максимальное значение и ограничить остальные Использование cURL и simpleXMLElement для извлечения данных. Как получить значение элемента XML после XPATH? Encryption Crypt – попытка работать на PHP так же, как Perl как отображать изображение из xml через php? Должен ли я использовать @ в моем PHP-коде? CURSOR в proc, который только блокирует текущую строку UPDATEd (в то время как UPDATING), и ничего больше для продолжительности? Можно ли вызывать ob_start PHP более одного раза? оптимизация скорости preg_replace Как я могу распаковать файл .gz с помощью PHP? Запрос Mysqli работает только на localhost, а не на веб-сервере В PHP: как я могу использовать функцию include (), какой параметр является переменной? PHP-адрес электронной почты прерван, если контент превышает определенный предел DOM: выбор всех текстовых узлов в документе (PHP) Ошибка анализа: синтаксическая ошибка, непредвиденная строка T_FUNCTION 10?

PHP Отправить локальный файл cURL

Я пытаюсь отправить локальный файл клиентом curl. Я нашел несколько примеров, чтобы сделать это с файлами из формы. В моем случае у меня нет формы, но локальный файл.

$fileName = $_SERVER["DOCUMENT_ROOT"]."/www/images/test.pdf"; if(!file_exists($fileName)) { $out['status'] = 'error'; $out['message'] = 'File not found.'; exit(json_encode($out)); } $data = array('name' => 'Foo', 'file' => '@'.$fileName); $cURL = curl_init("http://myapi/upload-images"); curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); curl_setopt($cURL, CURLOPT_POST, 1); curl_setopt($cURL, CURLOPT_POSTFIELDS, $data); $response = curl_exec($cURL); $error = curl_error($cURL); curl_close($cURL); die($response); 

При этом у меня нет erros, но на сервере массивы $ _POST и $ _SERVER пустые.

Я попробовал иначе, на этот раз создав файл Curl перед отправкой:

 // Mime type of file $finfo = finfo_open(FILEINFO_MIME_TYPE); $finfo = finfo_file($finfo, $fileName); $cFile = new CURLFile($fileName, $finfo, "file"); //var_dump($cFile); //CURLFile Object //( // [name] => C:/.../test.pdf // [mime] => application/pdf // [postname] => file // ) $cURL = curl_init("http://myapi/upload-images"); curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); curl_setopt($cURL, CURLOPT_POST, true); curl_setopt($cURL, CURLOPT_POSTFIELDS, array( 'file' => $cFile )); $response = curl_exec($cURL); curl_close($cURL); die($response); 

Тот же ответ. $ _FILES пуст.

Наконец, я нашел причину проблемы. Массив с файловыми данными должен иметь filedata и имена файлов.

Мы можем передать '@' перед именем файла с полным путем, но это устарело.

 $data = array( "filedata" => '@'.$fileName, "filename" => basename($fileName)); 

В этом случае я добавил объект Curl:

 $finfo = finfo_open(FILEINFO_MIME_TYPE); $finfo = finfo_file($finfo, $fileName); $cFile = new CURLFile($fileName, $finfo, basename($fileName)); $data = array( "filedata" => $cFile, "filename" => $cFile->postname); 

Полный код:

 $fileName = $_SERVER["DOCUMENT_ROOT"]."/www/images/test.pdf"; $fileSize = filesize($fileName); if(!file_exists($fileName)) { $out['status'] = 'error'; $out['message'] = 'File not found.'; exit(json_encode($out)); } $finfo = finfo_open(FILEINFO_MIME_TYPE); $finfo = finfo_file($finfo, $fileName); $cFile = new CURLFile($fileName, $finfo, basename($fileName)); $data = array( "filedata" => $cFile, "filename" => $cFile->postname); $cURL = curl_init("http://myapi/upload-images") curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); // This is not mandatory, but is a good practice. curl_setopt($cURL, CURLOPT_HTTPHEADER, array( 'Content-Type: multipart/form-data' ) ); curl_setopt($cURL, CURLOPT_POST, true); curl_setopt($cURL, CURLOPT_POSTFIELDS, $data); curl_setopt($cURL, CURLOPT_INFILESIZE, $fileSize); $response = curl_exec($cURL); curl_close($cURL); die($response);