表单w /文件输入字段HTTP的请求是什么样的?

时间:2015-10-15 22:15:53

标签: file http header

带有附加文件的HTTP标头是什么样的(客户端到服务器文件)以及如何解析它,例如在.NET中(小问题,RegEx和Streams等经验)。

1 个答案:

答案 0 :(得分:1)

来自HTML网络表单的文件上传使用HTTP POST请求和MIME multipart/form-data内容类型,该内容类型在HTML规范中定义(我已将HTTP标头添加到规范中显示的示例中):

HTML4:Section 17 Forms - 17.13.4 Form content types - multipart/form-data

  

请注意。有关文件上载的其他信息,请参阅[RFC2388],包括向后兼容性问题,“multipart / form-data”与其他内容类型之间的关系,性能问题等。

     

...

     

内容“multipart / form-data”遵循[RFC2045]中概述的所有多部分MIME数据流的规则。 “多部分/表单数据”的定义可在[IANA]注册表中找到。

     

...

     

以下示例说明了“multipart / form-data”编码。假设我们有以下形式:

<FORM action="http://server.com/cgi/handle"
      enctype="multipart/form-data"
      method="post">
  <P>
  What is your name? <INPUT type="text" name="submit-name"><BR>
  What files are you sending? <INPUT type="file" name="files"><BR>
  <INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
     

如果用户在文本输入中输入“Larry”,并选择文本文件“file1.txt”,则用户代理可能会发回以下数据:

POST /cgi/handle HTTP/1.1
Host: server.com
Content-Type: multipart/form-data; boundary=AaB03x
Content-Length: ...

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--
     

如果用户选择了第二个(图像)文件“file2.gif”,则用户代理可以按如下方式构建部件:

POST /cgi/handle HTTP/1.1
Host: server.com
Content-Type: multipart/form-data; boundary=AaB03x
Content-Length: ...

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y

--BbC04y
Content-Disposition: file; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--BbC04y
Content-Disposition: file; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--BbC04y--
--AaB03x--

HTML5:Section 4.10 Forms - 4.10.22 Form submission - 4.10.22.7 Multipart form data

  

另一方面,请考虑以下形式:

<form action="/find.cgi" method=post enctype="multipart/form-data">
  <input type=text name=t>
  <input type=search name=q>
  <input type=submit>
</form>
     

在给定相同的用户输入的情况下,提交的结果完全不同:用户代理执行HTTP POST到给定的URL,实体主体类似于以下文本:

POST /find.cgi HTTP/1.1
Host: server.com
Content-Type: multipart/form-data; boundary=----kYFrd4jNJEgCervE
Content-Length: ...

------kYFrd4jNJEgCervE
Content-Disposition: form-data; name="t"

cats
------kYFrd4jNJEgCervE
Content-Disposition: form-data; name="q"

fur
------kYFrd4jNJEgCervE--
     

...

     

部件的顺序必须与表单数据集中的字段顺序相同。必须将具有相同名称的多个条目视为不同的字段。

     

注意:特别是,这意味着作为单个<input type=file multiple>元素的一部分提交的多个文件将导致每个文件都有自己的字段; 未使用RFC 2388的“文件集”功能(“multipart / mixed”)。

阅读以下RFC,了解有关如何处理HTTP和MIME的更多详细信息:

RFC 2045 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies

RFC 2046 Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types
(特别是Section 5.1 Multipart Media Type

RFC 2047 MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text

RFC 2388 Returning Values from Forms: multipart/form-data

RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1