2017-09-29 66 views
0

如何“正确地”使用cURL上传文件的内容?使用CURL发布文件内容

这里有很多解释和问题,其中tmp文件是通过在文件上使用@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

最后我发现,并回答on this blog

添加curl_setopt($curl, CURLOPT_POSTREDIR, 3);是必需的选项,实际上可以使岗位要求的工作,而无需一个空体。


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


从埃弗特锅,上面链接的博客文章复制:

使用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的changelog,这是PHP 5.3.2,并 根据PHP的bug#49571有四个可能的值加:

0 - >不设置任何行为1 - >遵循重定向请求仅为301重定向的相同类型 。 2 - >遵循重定向,仅针对302重定向使用相同的 请求类型。 3 - >遵循重定向与 同一类型的请求301和302重定向。

相关问题