enctype这个属性管理的是表单的MIME(Multipurpose Internet Mail Extensions)编码,共有三个值可选:

1、application/x-www-form-urlencoded —默认值,作用是设置表单传输的编码,不能用于上传文件
eg: AJAX中xmlHttp.setRequestHeader(“Content-Type”,“application/x-www-form- urlencoded”),不写会报错的form表单里是可以不写enctype=application/x-www-form-urlencoded,因为默认HTML表单就是这种传输编码类型

2、multipart/form-data —制定传输数据的特殊类型,上传的非文本的内容,比如图片或是是mp3

3、text/plain —纯文本传输,不能用于上传文件;

​Scott Hanselman​​给出的解释

HTTP和文件上载如何通过HTTP工作

对我来说,了解为什么以及如何发生事情总是更好。如果你说“只是因为”或“无论如何,你只需添加它,并且它有效”,那么我认为这很难过。出于某种原因,虽然许多人都了解FORM POST,并且通常如何将表单数据传递到服务器,但是当文件被传输时,许多人只是总结它的魔力。为什么我们必须在包含文件上传的表单上添加enctype =“multipart / form = data”?因为表单现在将以多个部分进行POST。
如果你有这样的表格:

<form action="/home/uploadfiles" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>

生成的表单POST将如下所示(略微简化):

POST /home/uploadfiles HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d81b516112482
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 324
-----------------------------7d81b516112482
Content-Disposition: form-data; name="file"; filename="\\SERVER\Users\Scott\test.txt"
Content-Type: text/plain
foo
-----------------------------7d81b516112482
Content-Disposition: form-data; name="submit"
Submit
-----------------------------7d81b516112482--

请注意有关此POST的一些信息。首先,注意content-type和boundary =“”以及稍后如何使用边界,正好是多个部分之间的边界。看看第一部分如何显示我上传了一个text / plain类型的文件。您可以根据这些内容插入多个文件,如果它们都是一次性发布的话。
当然,如果它只是一个没有包含enctype =“multipart / form = data”的基本表单POST,那么看看它会有多么不同:

POST /home/uploadfiles HTTP/1.1 
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 13

submit=Submit

看看内容类型有何不同?这是一个常规的典型表单POST。也许是非典型的,因为它只包含一个提交按钮!…
顺便说一句,如果你查看一个包含多个附加文件的电子邮件,它看起来与第一个HTTP消息的主体非常类似,因为到处都可以找到多部分MIME编码,这与大多数好主意很常见。