我想問一個關於multipart/form-data
的問題。在HTTP標題中,我發現Content-Type: multipart/form-data; boundary=???
。多部分/形式數據的邊界是什麼?
???
是否可以由用戶自由定義?或者它通常來自HTML?我能否定義??? = abcdefg
?
我想問一個關於multipart/form-data
的問題。在HTTP標題中,我發現Content-Type: multipart/form-data; boundary=???
。多部分/形式數據的邊界是什麼?
???
是否可以由用戶自由定義?或者它通常來自HTML?我能否定義??? = abcdefg
?
是???由用戶自由定義?
是的。
還是一般從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
標題中指定它,以便服務器知道如何拆分發送的數據。
所以,你基本上需要:
Yout必須在邊界末尾添加一個額外的「 - 」。 – 2014-01-15 10:56:50
@SebastianPiskorski我不明白... – 2014-01-15 19:34:24
你可以在文檔中閱讀它。邊界結局必須有額外的兩個超級「 - 」 鏈接:http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 – 2014-01-15 21:38:01
確切答案的問題是:是的,你可以使用任意值作爲參數boundary
,因爲它的長度不能超過70個字節,僅由7-bit US-ASCII
(可打印)的字符。
如果使用multipart/*
的一個內容類型,實際上是需要指定在Content-Type
頭中的boundary
參數,否則服務器(在HTTP請求的情況下)將不能夠解析有效載荷。
你可能還需要設置charset
參數UTF-8
在Content-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--
的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請求。
我發現這是答案。 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 – Questions 2010-08-19 07:26:02