为什么是<form enctype=multipart/form-data>
文件上载到一个网络服务器时,需要?
Answer 1:
它与浏览器如何包传输通过HTTP二进制和表单数据做。 默认情况下唯一的形式的数据被发送,但如果窗体需要支持上传文件,则二进制数据,还必须附加和从表单数据分离。
斯科特Hanselman的给出了一个很好的解释在这里 :
HTTP和如何文件上传通过HTTP工作
它总是更好,对我来说,要了解为什么和如何有事情发生。 如果你说“只是因为”或“什么的,你只需要添加的是,和它的作品”,那么我认为这是可悲的。 出于某种原因,虽然很多人明白表单提交,一般形式的数据是如何传递到服务器,当一个文件被转移许多刚刚断定它的魔力。 我们为什么要对我们的形式,包括文件上传添加ENCTYPE =“多部分/表单数据=”? 因为形式将现在在多个部分公布。
如果你有这样的形式:
<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--
请注意,这个职位的几件事情。 首先,请注意内容类型和边界=“”,以及如何边界以后使用,因为正是,所述多个部分之间的边界。 见第一部分是如何显示我上传键入text / plain的单个文件。 你可以从这个插值你如何期望多个文件显示,如果他们在一次所有张贴。
当然,看看如何不同,这看起来好像它只是没有ENCTYPE =“多部分/表单数据=”包括一个基本的表单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。 也许是非典型的,因为它仅包括一个提交按钮! ....
顺便说一句,如果你看着你的多个附加文件的电子邮件,它看起来非常相似,如多MIME编码第一个HTTP消息的正文是比比皆是,如大多数好点子常见。
Answer 2:
这是规范中描述的HTML文件上传的一部分, RFC-1867 ,这是允许在HTML表单文件上传(大约1995年)的建议。
自第2节:
该提案提出了两个修改HTML:
1)添加输入的类型属性的文件选项。
2)允许接受输入的标记,这是允许的输入媒体类型或类型模式的列表属性。此外, 它定义了一个新的MIME媒体类型,多部分/格式数据 ,并解释当指定的HTML用户代理的行为
形式与ENCTYPE="multipart/form-data"
和/或<INPUT type="file">
标签。
当设置enctype
到multipart/form-data
,浏览器在上传各个文件或附件具有“多部分边界”,这是一个唯一的标识符,它定义的开始和每一个“部分”的端部隔开。
这允许浏览器在一个请求发送多个部分(因此名称),并确定每一个与像mime类型,文件名等自己的元数据