2010-08-18 65 views
235

我想問一個關於multipart/form-data的問題。在HTTP標題中,我發現Content-Type: multipart/form-data; boundary=???多部分/形式數據的邊界是什麼?

???是否可以由用戶自由定義?或者它通常來自HTML?我能否定義??? = abcdefg

+2

我發現這是答案。 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 – Questions 2010-08-19 07:26:02

回答

272

是???由用戶自由定義?

是的。

還是一般從HTML?

HTML什麼都沒有這樣做。參見下文。

是否可以定義??? = abcdefg?

是的。

如果你想下面的數據發送到Web服務器:使用application/x-www-form-urlencoded會是這樣

name = John 
age = 12 

name=John&age=12 

正如你可能會看到,服務器知道參數分離通過&,並且如果需要&作爲參數值,則它將被編碼。

現在,當服務器使用multipart/form-data接收到HTTP請求時,它如何知道參數值開始和結束的位置?使用邊界,類似於&

例如:

--XXX 
Content-Disposition: form-data; name="name" 

John 
--XXX 
Content-Disposition: form-data; name="age" 

12 
--XXX-- 

在這種情況下,邊界值是XXX。您在Content-Type標題中指定它,以便服務器知道如何拆分發送的數據。

所以,你基本上需要:

  • 使用,將不會出現在發送至服務器的HTTP數據的值。
  • 請保持一致,並在整個請求中使用相同的值。
+25

Yout必須在邊界末尾添加一個額外的「 - 」。 – 2014-01-15 10:56:50

+0

@SebastianPiskorski我不明白... – 2014-01-15 19:34:24

+7

你可以在文檔中閱讀它。邊界結局必須有額外的兩個超級「 - 」 鏈接:http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 – 2014-01-15 21:38:01

60

確切答案的問題是:是的,你可以使用任意值作爲參數boundary,因爲它的長度不能超過70個字節,僅由7-bit US-ASCII(可打印)的字符。

如果使用multipart/*的一個內容類型,實際上是需要指定在Content-Type頭中的boundary參數,否則服務器(在HTTP請求的情況下)將不能夠解析有效載荷。

你可能還需要設置charset參數UTF-8Content-Type頭,除非你可以絕對確保只有US-ASCII字符集將在有效載荷數據使用。

RFC2046幾個相關摘錄:

  • 4.1.2。字符集參數:

    與其他一些參數值不同,字符集參數的值不區分大小寫。默認字符集,在沒有字符集參數的情況下必須假設,是US-ASCII。

  • 5.1。多部分媒體類型

    如Content-Transfer-Encoding字段[RFC 2045]的定義所述,除了「7bit」,「8bit」或「binary」之外,對於類型爲「多」。在任何情況下,「多部分」邊界分隔符和標題字段始終表示爲7位US-ASCII(儘管標題字段可按照RFC 2047編碼非US-ASCII標題文本),並且身體部分內的數據可以編碼在每個適當的身體部位都有Content-Transfer-Encoding字段。

    多部分實體的Content-Type字段需要一個參數「boundary」。然後,邊界定界符行定義爲完全由兩個連字符(「 - 」,十進制值45)組成的行,後跟Content-Type標題字段的邊界參數值,可選線性空白和終止CRLF。

    邊界分隔符不能出現在被封裝的材料中,並且不得超過70個字符,不包括兩個前導連字符。

    最後一個身體部位後面的邊界分隔線是一個明顯的分隔符,它表示沒有更多的身體部位會跟隨。這樣的分隔線與先前的分隔線相同,並且在邊界參數值之後添加了兩個更多的連字符。

下面是使用任意的邊界的一個示例:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary" 

--another cool boundary 
Content-Disposition: form-data; name="foo" 

bar 
--another cool boundary 
Content-Disposition: form-data; name="baz" 

quux 
--another cool boundary-- 
10

的multipart/form-data的包含邊界分離名稱/值對。邊界的作用就像表單提交時傳遞的每個名稱/值對塊的標記一樣。邊界自動添加到請求標頭的內容類型。

帶有的表單enctype =「multipart/form-data」屬性將具有請求標題Content-Type:multipart/form-data;邊界--- WebKit193844043-h(瀏覽器生成vaue)。

傳遞的有效載荷看起來是這樣的:

Content-Type: multipart/form-data; boundary=—-WebKitFormBoundary7MA4YWxkTrZu0gW 

    --—-WebKitFormBoundary7MA4YWxkTrZu0gW 
    Content-Disposition: form-data; name=」file」; filename=」captcha」 
    Content-Type: 

    --—-WebKitFormBoundary7MA4YWxkTrZu0gW 
    Content-Disposition: form-data; name=」action」 

    submit 
    --—-WebKitFormBoundary7MA4YWxkTrZu0gW-- 

在Web服務方面,它在@Consumes消耗真實(「多/表單數據」)的形式。

請注意,當使用Chrome郵遞員測試您的webservice時,您需要從下拉框中檢查表單數據選項(單選按鈕)和文件菜單以發送附件。將content-type顯式提供爲multipart/form-data會引發錯誤。因爲邊界缺失,因爲它通過附加可以正常工作的邊界來覆蓋post-man對內容類型的curl請求。

請參閱RFC1341 sec7.2 The Multipart Content-Type