簡介 form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。 當action為get時候,瀏覽器用x-www-form- ...
簡介
form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。
當action為get時候,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2...),然後把這個字串append到url後面,用?分割,載入這個新的url。
當action為post時候,瀏覽器把form數據封裝到http body中,然後發送到server。如果沒有type=file的控制項,用預設的application/x-www-form-urlencoded就可以了。 但是如果有type=file的話,就要用到multipart/form-data了。瀏覽器會把整個表單以控制項為單位分割,併為每個部分加上Content-Disposition(form-data或者file),Content-Type(預設為text/plain),name(控制項name)等信息,並加上分割符(boundary)。
根據查找的資料得到如下總結:
- application/x-www-form-urlencoded: 窗體數據被編碼為名稱/值對。這是標準的編碼格式。
- multipart/form-data: 窗體數據被編碼為一條消息,頁上的每個控制項對應消息中的一個部分。
- text/plain: 窗體數據以純文本形式進行編碼,其中不含任何控制項或格式字元。
是什麼決定了表單的編碼?
熟悉表單元素<form>
的小伙伴,對其中的屬性enctype
一定不會陌生,就是它規定了對錶單提交給伺服器時表單數據編碼的內容類型(Content Type)。
表單編碼類型
知道了表單編碼由enctype
決定的,那麼它究竟有多少可選的取值呢?是不是所有的MIME類型它都能用呢?
實際上,根據HTML5 規範中所敘述的,enctype
具有以下三種選項,其中最後一項text/plain
是相比4.01新增的。
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
application/x-www-form-urlencoded
這是預設的編碼類型,使用該類型時,會將表單數據中非字母數字的字元轉換成轉義字元,如"%HH",然後組合成這種形式key1=value1&key2=value2
;所以後端在取數據後,要進行解碼。
註意:若表單中有文件,則只留文件名。
multipart/form-data
該類型用於高效傳輸文件、非ASCII數據和二進位數據,將表單數據逐項地分成不同的部分,用指定的分割符分割每一部分。每一部分都擁有Content-Disposition
頭部,指定了該表單項的鍵名和一些其他信息;並且每一部分都有可選的Content-Type
,不特殊指定就為text/plain
。下麵給出一個採用multipart/form-data
編碼類型的例子:
Request Headers:
Accept:application/json, text/plain, */* Accept-Encoding:gzip, deflate Accept-Language:zh-CN,zh;q=0.8 Connection:keep-alive Content-Length:13125 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryaqWXpQYCfMbAHgPh Cookie:shiro.sesssion=1a6d4f4d-ab5f-4a1b-a5cd-fc71cf9633cb Host:192.168.199.223 Origin:http://192.168.199.223 Referer:http://192.168.199.223/ User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Request Payload:
------WebKitFormBoundaryaqWXpQYCfMbAHgPh Content-Disposition: form-data; name="fileEnterprise"; filename="a.jpg" Content-Type: image/jpeg ------WebKitFormBoundaryaqWXpQYCfMbAHgPh Content-Disposition: form-data; name="enterpriseName" 有限責任公司 ------WebKitFormBoundaryaqWXpQYCfMbAHgPh Content-Disposition: form-data; name="unifiedSocialCreditCode" 91530700781667237G ------WebKitFormBoundaryaqWXpQYCfMbAHgPh--
註意:
-
一般來說,
method
和enctype
是兩個不同的互不影響的屬性,但在傳文件時,method
必須要指定為POST
,否則文件只剩下filename了; -
當沒有傳文件時,
enctype
會改回預設的application/x-www-form-urlencoded
。
text/plain
按照鍵值對排列表單數據key1=value1\r\nkey2=value2
,不進行轉義。
註意:若表單中有文件,則只留文件名。
application/json及其他MIME類型
另外,還需要說明表單數據編碼類型application/json
,已經被W3C遺棄(詳見HTML JSON Form Submission),建議不要在<form enctype="...">
中使用了,即使用瞭如果瀏覽器不支持,也會替換成application/x-www-form-urlencoded
。
同理,其餘的MIME類型,也不支持,均會替換成預設編碼application/x-www-form-urlencoded
。
註:1.MIME (Multipurpose Internet Mail Extensions) 是描述消息內容類型的網際網路標準。
2.MIME 消息能包含文本、圖像、音頻、視頻以及其他應用程式專用的數據。
想要瞭解詳細的Mime 類型列表,請參考《W3school:MIME 參考手冊》
總結
所以,enctype
可以認為就是表單數據的content type(MIME type)
,只不過其取值不能用除了上面提到的三個,否則會轉換成預設的編碼。