3 回答

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编码,这在大多数好主意中很常见。

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类型,文件名等)识别每个部分。

TA贡献1828条经验 获得超4个赞
您能否解释上传文本文件时的二进制数据?说我正在上传文本文件,为什么它可以作为请求参数发送到帖子正文中,其中参数名可以是文件名,值可以是文件内容?基本上,如果我可以手动将文件内容粘贴到HTML / JSP上的文本区域中,并将其作为普通的后期请求参数(在服务器端读取该内容)传输到服务器,那么为什么文件上传需要多部分形式?
- 3 回答
- 0 关注
- 821 浏览
相关问题推荐
添加回答
举报