我想問一個關於multipart/form-data
。 在HTTP標頭中,我發現Content-Type: multipart/form-data; boundary=???
Content-Type: multipart/form-data; boundary=???
。 html
是???
可由用戶自由定義? 或者它是從HTML生成的? 我能夠定義??? = abcdefg
??? = abcdefg
? chrome
是
???
可由用戶自由定義? 瀏覽器
是。 服務器
或者它是由HTML提供的? app
不, HTML與此無關 。 參見下文。 curl
我能夠定義
???
做爲abcdefg
? post
是。 測試
若是要將如下數據發送到Web服務器: 編碼
name = John age = 12
使用application/x-www-form-urlencoded
將是這樣的: url
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數據中的值。
保持一致,並在請求消息中的任何位置使用相同的值。
這個問題的確切答案是: 是的,你可使用任意值做爲boundary
參數 ,由於它的長度不超過70個字節,而且只包含7位US-ASCII
(可打印)字符。
若是您正在使用multipart/*
內容類型之一,則實際上須要在Content-Type
標頭中指定boundary
參數,不然服務器(在HTTP請求的狀況下)將沒法解析有效負載。
您可能還但願在Content-Type
標頭中將charset
參數設置爲UTF-8
,除非您能夠絕對肯定在有效內容數據中僅使用US-ASCII
字符集。
RFC2046的一些相關摘錄:
4.1.2。 字符集參數:
與其餘一些參數值不一樣,charset參數的值不區分大小寫。 默認字符集(在沒有charset參數的狀況下必須假設)是US-ASCII。
5.1。 多部分媒體類型
如Content-Transfer-Encoding字段[RFC 2045]的定義中所述,對於「multipart」類型的實體,不容許除「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(「multipart / form-data」)形式使用。
請注意,在使用chrome postman測試您的Web服務時,您須要從下拉框中檢查表單數據選項(單選按鈕)和文件菜單以發送附件。 將content-type顯式提供爲multipart / form-data會引起錯誤。 由於邊界丟失,由於它經過附加工做正常的邊界來覆蓋post man到服務器的內容類型的curl請求。