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

При этом у меня нет ошибок, но на сервере массивы $ _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 пусто.

3

Решение

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

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

$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);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]