为什么上传文件时需要表单enctype = multipart / form-data?

时间:2009-08-27 17:19:45

标签: html http file-upload specifications rfc

为什么在将文件上传到网络服务器时需要<form enctype=multipart/form-data>

2 个答案:

答案 0 :(得分:73)

它与浏览器如何打包二进制文件和表单数据以便通过HTTP传输有关。默认情况下,只发送表单数据,但如果表单需要支持上传文件,则还必须附加二进制数据并将其与表单数据分开。

Scott Hanselman对此here给出了一个很好的解释:

  

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>
  

生成的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编码,这与大多数好主意很常见。 / p>

答案 1 :(得分:2)

这是HTML文件上传规范的一部分,如RFC-1867中所述,这是允许以HTML格式上传文件的提议(大约1995年)。

从第2节开始:

  

此提案对HTML进行了两处更改:

     

1)为INPUT的TYPE属性添加FILE选项      2)允许   INPUT标签的ACCEPT属性,是一个列表         允许输入的媒体类型或类型模式。

     

此外,它定义了一个新的MIME媒体类型,multipart / form-data ,   并指定HTML用户代理在解释时的行为   包含ENCTYPE="multipart/form-data"和/或<INPUT type="file">的表单   标签

当您将enctype设置为multipart/form-data时,浏览器会使用&#34;多部分边界&#34;分隔上传中的每个文件或附件,这是一个定义开头和每个&#34;部分结束&#34;。

允许浏览器在一个请求中发送多个部分(因此名称),并使用自己的元数据(如mime类型,文件名等)识别每个部分。