php的curl读取本地文件,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为空.

解决方法:

最后,我找到了问题的原因.包含文件数据的数组必须具有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);

标签:curl,restful-architecture,upload,php

来源: https://codeday.me/bug/20191121/2048335.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值