2009-12-16 267 views
7

说我上传的PHP文件,卷曲:PHP卷曲:手动设置Content-Length头

$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手动设置)在这种情况下,我将如何获得身体的内容长度?

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

回答

7

要获得帖子正文的长度,请尝试格式化字段int GET样式字符串(又名param1=value1&param2=value2),然后将该字符串设置为CURL_POSTFIELDScurl_setopt。数组不需要提供。您只需使用strlen()即可获取用于内容长度标题的值。

如果您要发布的文件(或多个文件)除了其他字段(如上面的示例中所示),则必须提供该文件的值为@/path/to/file,然后以字节为单位获取文件大小并添加那到总内容长度。

因此,对于上述示例,假定文件test.txt位于服务器的/test dir中,则后值字符串将为[email protected]/test/text.txt&submit=UPLOAD。您也必须使用此字符串,然后将其分配为卷曲后值。要获得内容长度,您将获得该字符串的长度(post url编码),并将添加到文件大小/test/test.txt

1

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

实际上,唯一一个可以计算出大小,从我能看到的是cURL本身。但它不这样做8-P