Я пытаюсь отправить локальный файл клиентом 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);