为什么在将文件上传到web服务器时需要<form enctype=multipart/form-data>
?
发布于 2009-08-27 17:23:07
它与浏览器如何打包通过HTTP传输的二进制和表单数据有关。默认情况下,只发送表单数据,但如果表单需要支持上传文件,则还必须附加二进制数据并将其与表单数据分开。
Scott Hanselman对这个here做了很好的解释
超文本传输协议和文件上传的工作原理
对我来说,理解事情发生的原因和方式总是更好的。如果你说“仅仅是因为”或者“随便什么,你只要加上它,它就起作用了”,那么我认为那是可悲的。出于某种原因,虽然许多人理解表单发布以及表单数据通常是如何传递到服务器上的,但当文件被传输时,许多人只是得出结论:它很神奇。为什么我们必须在包含文件上传的表单上添加enctype="multipart/form=data“?因为表单现在将是分成多个部分的POSTed。
如果您有这样的表单:
<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--
注意关于这篇文章的几件事。首先,注意content-type和boundary="“,以及以后如何使用边界,就像多个部分之间的边界一样。请看第一部分是如何显示我上传了一个类型为text/plain的文件。你可以由此推断出,如果多个文件同时都是POSTed的,你会期望多个文件显示出来。
当然,看看如果这只是一个基本的表单POST而没有包含enctype="multipart/ form =data“,会有多大的不同:
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
看到内容类型有什么不同了吗?这是一个常规的、典型的表单帖子。也许这不是典型的,因为它只包含一个提交按钮!
顺便说一句,如果你看了一封带有多个附件的电子邮件,它看起来与第一封超文本传输协议邮件的正文非常相似,因为多部分MIME编码随处可见,这在大多数好的想法中都很常见。
发布于 2017-09-14 08:14:37
这是RFC-1867中描述的HTML文件上传规范的一部分,该规范提议允许以HTML形式上传文件(大约1995年)。
从第2节开始:
此提案对HTML做了两个更改:
1)为INPUT的TYPE属性添加文件选项。
2)允许输入标签的ACCEPT属性,这是允许输入的媒体类型或类型模式的列表。
此外,它还定义了一种新的MIME媒体类型multipart/form-data,并指定了在解释
包含ENCTYPE="multipart/form-data"
和/或<INPUT type="file">
的表单
标签。
当您将enctype
设置为multipart/form-data
时,浏览器将上载中的每个文件或附件用“多部分边界”分隔,“多部分边界”是定义每个“部分”的开始和结束的唯一标识符。
这允许浏览器在一个请求中发送多个部分(因此而得名),并使用自己的元数据标识每个部分,如mime类型、文件名等。
https://stackoverflow.com/questions/1342506
复制相似问题