2009-12-16 82 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