使用CURL

时间:2017-09-29 06:38:00

标签: php curl

如何使用cURL“正确”上传文件内容?

这里有很多解释和问题,其中tmp文件是通过curl发送的,文件上有@prefix或使用curlFile api。在我的用例中,我不想创建一个tmp文件,只是发布file_get_contents('php://input')的内容作为帖子请求的主体。服务器不接受多部分表单请求。

以下剪辑将在PHP7中运行:

$body = file_get_contents('php://input');
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

将内容类型设置为json会感觉很难看,无论流的实际内容是什么。但似乎有效。遗憾的是,我需要支持一个非常旧版本的PHP,并感觉用完了选项。

我的问题是: 以上示例是否正确,即使对于PHP 7,还是可以做得更好? 另外:是否有任何改进或选项可用于使用PHP 5.3.10?在这个旧版本中,帖子体似乎总是空的。

1 个答案:

答案 0 :(得分:1)

最后我找到并回答on this blog

添加curl_setopt($curl, CURLOPT_POSTREDIR, 3);是必要的选项,可以在没有空身的情况下实际发布请求。

编辑&抬头:只有在您希望重定向您的请求时才需要此选项。在提出这个问题并发布答案时我犯了一个错误。请检查您的请求是否从http重定向到https或相反,并先解决此问题以防止出现问题。

从Evert Pot的博文中复制,上面链接:

  

使用CURLOPT_POSTFIELDS,您可以将请求正文作为字符串提供。   让我们尝试使用该方法上传我们之前失败的请求:

<?php

$curl = curl_init('http://example.org/someredirect');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, file_get_contents('largefile.json'));

curl_exec($curl);

?>
     

这也不会完全按照您的预期运作。而第二个   对/ someredirect的请求仍然是POST请求,它将被发送   有一个空的请求正文。

     

要解决此问题,请使用未记录的CURLOPT_POSTREDIR选项。

<?php

$curl = curl_init('http://example.org/someredirect');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, file_get_contents('largefile.json'));
curl_setopt($curl, CURLOPT_POSTREDIR, 3);

curl_exec($curl);

?>
     

根据PHP更新日志,这是在PHP 5.3.2中添加的,并且   根据PHP错误#49571,有四个可能的值:

     

0 - &gt;不要设置任何行为1 - &gt;按照相同类型的重定向   请求仅限301重定向。 2 - &gt;跟着重定向一样   请求类型仅适用于302重定向。 3 - &gt;跟随重定向   301和302重定向的相同类型的请求。

相关问题