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