一个<input />

时间:2016-04-17 08:12:40

标签: forms http post

背景:

根据W3c,在<input>字段中选择的多个文件应由&#34; multipart / mixed&#34;输入带有单独的边界字符串,只有一个&#34; name&#34;参数(只要名称在表单中应该是唯一的)。

编写POST数据处理时,我注意到主要浏览器发送这样的多个文件,好像它们来自不同的<input>元素,但具有相同的名称。即而不是:

Content-Type: multipart/form-data; boundary=AaB03x

--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

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

......他们发送的内容如下:

Content-Type: multipart/form-data; boundary=AaB03x

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

... contents of file1.txt ...
--BbC04y
Content-Disposition: form-data; name="files"; filename="file2.gif"
Content-Type: image/gif

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

问题:

我应该如何处理POST数据?是否有浏览器会将多个文件作为&#34; multipart / mixed&#34;或者不需要处理这种情况,我应该简化我的代码吗?

注意:我正在编写处理HTTP的框架,因此不能使用其他库和框架。

1 个答案:

答案 0 :(得分:10)

我已经确认你发现了什么。 我测试了Firefox和Chromium,这就是我得到的:

Content-Type: multipart/form-data; boundary=---------------------------148152952621447

-----------------------------148152952621447
Content-Disposition: form-data; name="files"; filename="fileOne.txt"
Content-Type: text/plain

this is fileOne.txt
-----------------------------148152952621447
Content-Disposition: form-data; name="files"; filename="fileTwo.txt"
Content-Type: text/plain

this is fileTwo.txt
-----------------------------148152952621447--

经过调查,我发现the W3c information you provided 基于RFC2388,已被RFC7578淘汰。

根据RFC7578第4.3节(我强调):

  

[RFC2388]建议使用嵌套的&#34; multipart / mixed&#34;来传输单个表单字段的多个文件。部分。 此用法已弃用。

     

为了匹配广泛部署的实现,必须通过在单独的部分中提供每个文件来发送多个文件,但所有文件都具有相同的&#34; name&#34;参数。

所以,你的问题:

  

我应该如何处理POST数据?

我的建议是忽略W3c信息并遵循RFC7578。

  

是否有浏览器会将多个文件作为&#34; multipart / mixed&#34;或者不需要处理这种情况,我应该简化我的代码吗?

非常老的浏览器可能会使用&#34; multipart / mixed&#34;但无论如何都不推荐使用,所以不需要处理这种情况。

我的建议:你一定要简化你的代码。