2014-12-01 2 views
3

Im пытается отправить локальный файл клиентом curl app. Я нашел несколько примеров, чтобы сделать это с файлами из формы. В моем случае у меня нет формы, но локальный файл.PHP Отправить локальный файл 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 пуст.

+0

http://stackoverflow.com/questions/15200632/how-to- upload-file-using-curl-with-php –

+0

Спасибо за ваш ответ @StrawHat. В моем первом случае я попробовал это, добавив realpath(). Тот же ответ, $ _FILES пуст на сервере. – Dreyfi

ответ

3

Наконец-то я нашел причину проблемы. Массив с файловыми данными должен иметь 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); 
Смежные вопросы