为了账号安全,请及时绑定邮箱和手机立即绑定

为何在上传文件时需要form enctype = multipart / form-data?

为何在上传文件时需要form enctype = multipart / form-data?

月关宝盒 2019-10-30 12:48:36
为什么<form enctype=multipart/form-data>将文件上传到Web服务器时需要?
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

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


Scott Hanselman 在这里对此做了很好的解释:


HTTP以及如何通过HTTP上传文件


对我来说,了解为什么发生什么以及如何发生总会更好。如果您说“仅仅是因为”或“随便什么,只需添加它,它就可以工作”,那么我认为这很可悲。由于某些原因,尽管许多人都了解FORM POST以及通常如何将表单数据传递到服务器,但是当文件被传输时,许多人只是认为这是神奇的。为什么我们必须在包含文件上传的表单上添加enctype =“ multipart / form = data”?因为现在该表单将分多个部分发布。


如果您有这样的表格:


<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 =“”以及稍后如何使用边界,准确地说,就是多个部分之间的边界。查看第一部分如何显示我上载了一个文本/纯文本类型的文件。您可以据此插值,如果一次发送所有多个文件,则希望它们显示出来。


当然,看看这只是基本表单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

看看内容类型有何不同?这是常规的典型形式POST。可能是非典型的,因为它仅包含一个“提交”按钮!....


顺便说一句,如果您查看一封带有多个附件的电子邮件,它看起来非常类似于第一个HTTP消息的正文,因为随处可见多部分MIME编码,这在大多数好主意中很常见。


查看完整回答
反对 回复 2019-10-30
?
SMILET

TA贡献1796条经验 获得超4个赞

这是RFC-1867中描述的HTML文件上载规范的一部分,该提议是允许以HTML形式上载文件的提议(大约在1995年)。


从第2节:


该提案对HTML进行了两项更改:


1)为INPUT的TYPE属性添加FILE选项。

2)允许INPUT标签使用ACCEPT属性,该属性是允许输入的媒体类型或类型模式的列表。


此外,它定义了新的MIME媒体类型multipart / form-data,并指定了在解释

带有ENCTYPE="multipart/form-data"和/或<INPUT type="file">

标签的表单时HTML用户代理的行为。


设置enctype为时multipart/form-data,浏览器将使用“多部分边界”分隔上载中的每个文件或附件,这是定义每个“部分”开始和结束的唯一标识符。


这样一来,浏览器就可以在一个请求中发送多个部分(因此而得名),并使用其自己的元数据(例如mime类型,文件名等)识别每个部分。


查看完整回答
反对 回复 2019-10-30
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您能否解释上传文本文件时的二进制数据?说我正在上传文本文件,为什么它可以作为请求参数发送到帖子正文中,其中参数名可以是文件名,值可以是文件内容?基本上,如果我可以手动将文件内容粘贴到HTML / JSP上的文本区域中,并将其作为普通的后期请求参数(在服务器端读取该内容)传输到服务器,那么为什么文件上传需要多部分形式?

查看完整回答
反对 回复 2019-10-30
  • 3 回答
  • 0 关注
  • 821 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信