2014-12-26 45 views
1

我只是有一個問題,我需要使用PHP中的curl來設置Content-Length標頭來製作multipart/form-data POST HTTP請求。使用cURL PHP進行HTTP raw POST請求multipart/form-data時,如何正確設置Content-Length標題?

例如,我有一個PHP腳本,這使得捲曲POST上傳到服務器上的圖像,該請求的HTTP實體主體的內容是這樣的:

------Boundary123 
Content-Disposition: form-data; name="files[]"; filename="image.png" 
Content-Type: image/png 

... contents of image.png 
------Boundary123-- 

我做這樣的事情這個:

$bodiEntity = "--".$boundary."\r\n". 
       'Content-Disposition: form-data; name="files[]"; filename="'.$fileName.'"'."\r\n". 
       'Content-Type: img/png'."\r\n\r\n". 
       file_get_contents($fileName)."\r\n". // binary contents of file 
       "--".$boundary."--\r\n"; 

但是然後,我應該爲Content-Length頭設置哪個值?我知道,它是實體主體的字節數,但我應該如何處理「\ r \ n」? 我的意思是,如果我做strlen("\r\n")我得到2作爲返回值,但我想這應該是1(意思)一個字節處理髮送multipart/form-data時,我是對嗎?

所以我應該只使用strlen()像邊界線,內容處置,Content-Type和計數爲「\ r \ n」作爲單個字符,並使用filesize()獲取文件的文件大小以字節爲單位,然後串總結所有值以獲取Content-Length頭的最終值?或者,我應該像PHP那樣只將「\ r \ n」計爲2個字符?

感謝您的關注!

+0

'cURL'不會自動爲您做? – Barmar

+0

我不知道,是嗎? – tonix

回答

0

將「\ r \ n」計爲兩個字節。 CRLF對的長度是兩個字節。包括

- the boundary prefix ("--"), 
- boundary, 
- the content bytes, 
- the interim boundaries and their prefixes, 
- the final boundary prefix, 
- boundary and boundary post fix, 

所有的整個身體應占的內容長度。

至於內容長度。從HTTP 1.1開始,多部分請求中的每個文件部分都沒有定義內容長度。

但是,總的內容長度標題應該在請求開始時定義。 您不妨閱讀第3.3.2節的RFC 7230。它由原理網頁和HTTP標準作者之一Roy Thomas Fielding編寫。

但是,還有很多其他方式可以將文件作爲請求發送,但並不一定需要在基於邊界的多部分請求中進行限制。 POST方法中的其他機制本身就是原始內容類型請求。內容在請求中的頭部結束後立即傳輸,然後是空行(讀取「\ r \ n」)。

其他機制包括也可以類似的方式工作的PUT請求。在技​​術上,這兩種方式都有差異,將它們區分開來,儘管我認爲不會詳細討論這個問題,所以我只是略過它。

相關問題