2015-10-15 84 views

回答

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”遵循[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> 

如果用户在文本输入进入“拉里”,并选择文本文件“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的(“多部分/混合”),不使用功能“的文件集”。

阅读更多细节在以下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

相关问题