它与浏览器如何打包二进制数据并通过HTTP传输形成数据有关。默认情况下只发送表单数据,但是如果表单需要支持上传文件,则二进制数据也必须附加并与表单数据分离。
Scott Hanselman给了这个here的很好的解释:
HTTP and How File Upload works via HTTP
It’s always better, for me, to understand WHY and HOW something is happening. If you say “just because” or “whatever, you just add that, and it works” then I think that’s sad. For some reason while many folks understand FORM POSTs and generally how form data is passed up to the server, when a file is transferred many just conclude it’s magic. Why do we have to add enctype=”multipart/form=data” on our forms that include file uploads? Because the form will now be POSTed in multiple parts.
If you have a form like this:
Filename:
The resulting Form POST will look like this (slightly simplified):
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--
Notice a few things about this POST. First, notice the content-type and boundary=”” and how the boundary is used later, as exactly that, a boundary between the multiple parts. See how the first part shows that I uploaded a single file, of type text/plain. You can interpolate from this how you’d expect multiple files to show up if they were all POSTed at once.
And of course, look at how different this would look if it were just a basic form POST without the enctype=”multipart/form=data” included:
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
See how the content type is different? This is a regular, typical form POST. Perhaps atypical in that it includes only a Submit button!
….
As an aside, if you looked at an email of yours with multiple attached files, it would look VERY similar to the body of the first HTTP message as multipart MIME encoding is found everywhere, as is common with most good ideas.
本文深入探讨了通过HTTP进行文件上传的技术细节,特别是如何通过multipart/form-data格式来组织和传输文件及表单数据。
1万+

被折叠的 条评论
为什么被折叠?



