PHP通过cURL发送本地文件 [英] PHP Send local file by cURL

查看:165
本文介绍了PHP通过cURL发送本地文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过客户端curl应用程序发送本地文件。我发现一些例子来做一个表单的文件。在我的例子中,我没有表单,而是一个本地文件。

Im trying to send a local file by client curl app. I found some examples to do that with files from a form. In my case, I have no form, but a local file.

$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数组为空。

With this, I have no erros, but in server the $_POST and $_SERVER arrays is empty.

我试过,否则,这次创建一个Curl文件发送之前:

I tried otherwise, this time creating a Curl file before send:

// 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为空。

Same response. $_FILES is empty.

推荐答案

最后我发现了问题的原因。具有文件数据的数组必须有filedata和文件名键。

Finally I found the reason of issue. The array with file data must have filedata and filename keys.

我们可以在文件名之前使用完整路径传递'@',但是已经过时了。

We can pass '@' before file name with full path but this is deprecated.

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

在这种情况下,我添加了一个Curl对象:

In this case I added a Curl object:

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

这篇关于PHP通过cURL发送本地文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆