PHP cURL文件获取内容始终为空

时间:2018-03-23 14:19:41

标签: php curl guzzle

我在Paw(和/或Postman)中创建了一个端点来处理文件上传。它很棒!

enter image description here

这很简单。在我的应用程序中,我可以执行以下操作:

echo file_get_contents('php://input');

它将打印出图像/文件(一只可爱的小猫)的编码表示。

问题是,我似乎无法仅使用cURL重现此行为(当前应用程序使用Guzzle)。

当我尝试类似的事情时:

$target_url = 'http://my-document-handling-service.net:8000/documents';

$request = curl_init($target_url);

curl_setopt($request, CURLOPT_POST, true);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTREDIR, 3);

curl_setopt(
    $request,
    CURLOPT_POSTFIELDS,
    array(
      'file' => '/Users/xxxxxxx-xxxx/Documents/kitten-test-upload-image-1.jpg'
    ));

echo curl_exec($request);

curl_close($request);

正文(file_get_contents())始终为空。我真的不明白cURL我一直只是用Guzzle - 但现在我必须使用cURL而且我无法得到身体。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

(对于评论来说太长了,现有答案非常接近正确,虽然有问题并且无法正常工作,但是没有说明原因代码失败的原因) - 当你给CURLOPT_POSTFIELDS一个数组时,它以multipart/form-data - 格式对输入进行编码,并将PHP解析为$ _POST(以及文件上传,$ _FILES),并在流程中清空php://输入(它为此执行此操作)它内置支持的任何编码,并且在编写时,有2个application/x-www-form-urlencoded, and multipart / form-data`),以及您的代码

curl_setopt(
    $request,
    CURLOPT_POSTFIELDS,
    array(
      'file' => '/Users/xxxxxxx-xxxx/Documents/kitten-test-upload-image-1.jpg'
    ));

file格式向服务器发送值为'/Users/xxxxxxx-xxxx/Documents/kitten-test-upload-image-1.jpg'的变量multipart/form-data,因此您的值实际上在$_POST['file'],但如果您要发送原始图像直接,没有编码,所以你可以在目标服务器上使用php://输入,使用CURLOPT_INFILE或CURLOPT_POSTFIELDS,例如

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_INFILE,($fp=fopen('abc.txt','rb')));
curl_setopt($ch, CURLOPT_INFILESIZE,123);
(...)
curl_exec($ch);
fclose($fp);

curl_setopt($ch,CURLOPT_POSTFIELDS,file_get_contents("abc.txt"));
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/octet-stream'));
curl_exec($ch);

(请注意,第二种方法将使用更多ram,它会在上传之前将整个文件放入内存中,而第一种方法将以块的形式发送数据,从而可以上传任何大小的文件而不会耗尽ram ,与第二种方法不同)

答案 1 :(得分:0)

通常,CURL将发送使用application / x-www-form-urlencoded或multipart / form-data编码的Postfields。 (Details)。

您需要的是POST数据中的RAW编码。我还没有测试过它。但它会是这样的:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
$res=fopen("abc.txt","rb"));   //CURLOPT_INFILE needs a stream resource
curl_setopt($ch, CURLOPT_INFILE, $res);
curl_setopt($ch, CURLOPT_INFILESIZE,123);
...
curl_exec($ch);
...
fclose($res);
相关问题