multipart / form-data的邊界是什麼?

我想問一個關於multipart/form-data 。 在HTTP標頭中,我發現Content-Type: multipart/form-data; boundary=??? Content-Type: multipart/form-data; boundary=???html

??? 可由用戶自由定義? 或者它是從HTML生成的? 我能夠定義??? = abcdefg ??? = abcdefgchrome


#1樓

??? 可由用戶自由定義? 瀏覽器

是。 服務器

或者它是由HTML提供的? app

不, HTML與此無關 。 參見下文。 curl

我能夠定義??? 做爲abcdefgpost

是。 測試

若是要將如下數據發送到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數據中的值。

  • 保持一致,並在請求消息中的任何位置使用相同的值。


#2樓

這個問題的確切答案是: 是的,你可使用任意值做爲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--

#3樓

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請求。

請參閱RFC1341 sec7.2 Multipart Content-Type

相關文章
相關標籤/搜索