PHP CURL:手动设置内容长度标题

时间:2009-12-16 18:50:46

标签: php http curl

假设我使用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 );

现在假设我必须手动设置内容长度标题。

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

我如何测量身体的大小? (只是将filesize指定为内容长度似乎不起作用)

在另一个示例中,如果正文包含的数据不是实际文件,该怎么办? (由postfields手动设置)在那种情况下,我如何获得正文的内容长度?

感谢您对此提出任何看法,这似乎是一个棘手的问题。

2 个答案:

答案 0 :(得分: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此字符串。要获得内容长度,您需要获得该字符串的长度(发布网址编码)并将其添加到/test/test.txt的文件大小

答案 1 :(得分:1)

这听起来不对。生成的数据将包括子标题和Content-Length需要也包括那些子标题。并且由于子标题包含边界,可能包含此数据和该数据,因此整个事情无法工作(如果不确切知道完整请求将会是什么,则无法指定大小。)

实际上,唯一可以计算尺寸的是我所能看到的cURL本身。但它没有做到8-P