PHP CURL:手动设置content-length头信息

7

假设我使用PHP CURL上传文件:

$postData = array();

$postData['file_name'] = "test.txt";
$postData['submit'] = "UPLOAD";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );

现在假设我必须手动设置content-length头。

$headers=array(
     "POST /rest/objects HTTP/1.1",
     'accept: */*',
     "content-length: 0" //instead of 0, how could I get the length of the body from curl?
    )
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers
$response = curl_exec($ch);

我该如何测量消息体的大小?(仅指定内容长度作为文件大小似乎不起作用)

在另一个例子中,如果消息体包含的是实际上不是文件的数据(由postfields手动设置),那么我该如何获取消息体的内容长度?

感谢任何能够解决这个看起来很棘手的问题的帮助。

2个回答

7
要获取帖子正文的长度,可以将字段格式化为GET风格的字符串(即param1=value1&param2=value2),然后将该字符串设置为CURL_POSTFIELDS并使用curl_setopt。不必提供数组。您只需使用strlen()来获取用于内容长度标头的值。
如果您要在提交其他字段的同时提交文件(或文件),就像上面的示例一样,您必须将文件的值作为@/path/to/file提供,然后获取以字节为单位的文件大小,并将其添加到总内容长度中。
因此,对于上面的示例,假设文件test.txt位于服务器的/test dir中,则post值字符串将是file_name=@/test/text.txt&submit=UPLOAD。在将其分配为curl post值之前,您必须url_encode此字符串。要获取内容长度,请获取该字符串(post url-encoding)的长度并将其添加到/test/test.txt的文件大小中。

1

听起来不对。生成的数据将包括子标题,Content-Length也需要包括这些子标题。由于子标题包含边界,可能包括这个和那个数据,所以整个过程无法工作(在不知道完整请求是什么的情况下无法指定大小)。

实际上,从我看到的情况来看,唯一能计算大小的是cURL本身。但它并没有做到这一点8-P。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接