PHP 通过 cURL 发送本地文件

标签 php curl upload restful-architecture

我正在尝试通过客户端 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 为空。

最佳答案

终于找到问题的原因了。包含文件数据的数组必须有文件数据和文件名键。

我们可以在带有完整路径的文件名前传递“@”,但这已被弃用。

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

关于PHP 通过 cURL 发送本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27228367/

相关文章:

php - laravel carbon 从集合的日期列中获取日期名称

php - curl JSON 时 POST 为空

java - 最RESTful文件发送Java Spring

php - 将 wordpress 身份验证与现有用户数据库集成

php - mysql:从 DESC LIMIT 中选择最后 10 行

php - 有没有办法测试闭包是否也是生成器?

php - 如何在 PHP 中重置 Curl 变量?

javascript - 格式化curl返回数据

python - 上传到 Azure Blob 存储时自动设置内容类型

javascript - 文件-通过本地文件路径上传