C# form表單提交enctype="multipart/form-data" 與 enctype="application/x-www-form-urlencoded" 兩者之間的區別


1.application/x-www-form-urlencoded

GET方式,會將表單中的數據(鍵值對)經過urlencode編碼后追加到url中。

POST方式,會將表單中的數據經過urlencode編碼后放在request body 中。

2.multipart/form-data

當需要在表單內上傳文件時(二進制流數據)時,就需要使用 multipart/form-data

"application/x-www-form-urlencoded",他是默認的MIME內容編碼類型,一般可以用於所有的情況。但是他在傳輸比較大的二進制或者文本數據時效率極低。這種情況應該使用"multipart/form-data"。如上傳文件或者二進制數據和非ASCII數據。

application/x-www-form-urlencoded 消息中:

......

name=ryan+ou&email=ryan@rhythmtechnology.com

......

(不同的field會用"&"符號連接;空格被替換成"+";fieldvalue間用"="聯系,等等)

再看multipart/form-data 消息中:

......

-----------------------------7cd1d6371ec

Content-Disposition: form-data; name="name"

 

ryan ou

-----------------------------7cd1d6371ec

Content-Disposition: form-data; name="email"

 

ryan@rhythmtechnology.com

-----------------------------7cd1d6371ec

Content-Disposition: form-data; name="Logo"; filename="D:\My Documents\My Pictures\Logo.jpg"

Content-Type: image/jpeg

 ......

(每個field被分成小部分,而且包含一個value"form-data""Content-Disposition"的頭部;一個"name"屬性對應fieldID,等等)

 

 

 

-------------------------------------------------

application/x-www-form-urlencoded

 

1、它是post的默認格式,使用jsURLencode轉碼方法。包括將namevalue中的空格替換為加號;將非ascii字符做百分號編碼;將inputnamevalue用‘=’連接,不同的input之間用‘&’連接。

 

2、百分號編碼什么意思呢。比如漢字‘丁’吧,他的utf8編碼在十六進制下是0xE4B881,占3個字節,把它轉成字符串‘E4B881’,變成了六個字節,每兩個字節前加上百分號前綴,得到字符串“%E4%B8%81”,變成九個ascii字符,占九個字節(十六進制下是0x244534254238253831)。把這九個字節拼接到數據包里,這樣就可以傳輸“非ascii字符的  utf8編碼的 十六進制表示的 字符串的 百分號形式”,^_^

 

3、同樣使用URLencode轉碼,這種post格式跟get的區別在於,get把轉換、拼接完的字符串用‘?’直接與表單的action連接作為URL使用,所以請求體里沒有數據;而post把轉換、拼接后的字符串放在了請求體里,不會在瀏覽器的地址欄顯示,因而更安全一些。

---------------------

multipart/form-data

 

1、對於一段utf8編碼的字節,用application/x-www-form-urlencoded傳輸其中的ascii字符沒有問題,但對於非ascii字符傳輸效率就很低了(漢字‘丁’從三字節變成了九字節),因此在傳很長的字節(如文件)時應用multipart/form-data格式。smtp等協議也使用或借鑒了此格式。

 

2、此格式表面上發送了什么呢。用此格式發送一段一句話和一個文件,請求體如下

 

 

 

同時請求頭里規定了Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymNhhHqUh0p0gfFa8

 

可見請求體里不同的input之間用一段叫boundary的字符串分割,每個input都有了自己一個小header,其后空行接着是數據。

 

3、此格式實際上發送了什么呢。fiddler抓包如下

 

 

 

右邊明顯看到了一段亂碼,為什么呢,以漢字‘丁’為例,其utf8編碼為0xE4B881,這三個字節會直接拼接到數據包中,即其在實際發送時只占三字節,上圖右邊是逐字節轉為ascii字符顯示的,因此會顯示為三個亂碼字符。

 

4、由上可見,multipart/form-data將表單中的每個input轉為了一個由boundary分割的小格式,沒有轉碼,直接將utf8字節拼接到請求體中,在本地有多少字節實際就發送多少字節,極大提高了效率,適合傳輸長字節。

 

"application/x-www-form-urlencoded",他是默認的MIME內容編碼類型,一般可以用於所有的情況。但是他在傳輸比較大的二進制或者文本數據時效率極低。這種情況應該使用"multipart/form-data"。如上傳文件或者二進制數據和非ASCII數據。

---------------------

版權聲明:本文為CSDN博主「hula_好天氣」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/u013827143/article/details/86222486


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM