1、HTML < form > 標簽的 enctype 屬性
定義和用法
enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。
默認地,表單數據會編碼為 "application/x-www-form-urlencoded"。
就是說,在發送到服務器之前,所有字符都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 ASCII HEX 值)。
2、form表單在提交時:
1)先把form表單里的表單元素的name屬性和value屬性進行收集。
2)按照enctype屬性的設置,選擇合適的編碼方式,對數據進行編碼,放在請求頭里
3)瀏覽器進行發送。
3、application/x-www-form-urlencoded
這應該是最常見的 POST 提交數據的方式了。
瀏覽器的原生 < form > 表單,如果不設置 enctype 屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數據。
<form action="form_action.asp" enctype="text/plain">
<p>First name: <input type="text" name="fname" /></p>
<p>Last name: <input type="text" name="lname" /></p>
<input type="submit" value="Submit" />
</form>
此時可以看到:
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
首先,Content-Type 被指定為 application/x-www-form-urlencoded;
其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。
大部分服務端語言都對這種方式很好的支持,常用的如jQuery中的ajax請求,Content-Type 默認值都是application/x-www-form-urlencoded;charset=utf-8
1)它是post的默認格式,使用js中URLencode轉碼方法。
包括將name、value中的空格替換為加號;將非ascii字符做百分號編碼;將input的name、value用‘=’連接,不同的input之間用‘&’連接。
2)百分號編碼什么意思呢。
比如漢字‘丁’吧,他的utf8編碼在十六進制下是0xE4B881,占3個字節,把它轉成字符串‘E4B881’,變成了六個字節,每兩個字節前加上百分號前綴,得到字符串“%E4%B8%81”,變成九個ascii字符,占九個字節(十六進制下是0x244534254238253831)。
把這九個字節拼接到數據包里,這樣就可以傳輸“非ascii字符的 utf8編碼的 十六進制表示的 字符串的 百分號形式”,^_^。
3)同樣使用URLencode轉碼,這種post格式跟get的區別在於,get把轉換、拼接完的字符串用‘?’直接與表單的action連接作為URL使用,所以請求體里沒有數據;
而post把轉換、拼接后的字符串放在了請求體里,不會在瀏覽器的地址欄顯示,因而更安全一些。
4、multipart/form-data
這也是常見的post請求方式,一般用來上傳文件,各大服務器的支持也比較好。
所以我們使用表單 上傳文件 時,必須讓