背景:

根据 W3c ,在 <input> 字段中选择的多个文件应该通过“multipart/mixed”类型发送,带有单独的边界字符串和只有一个“name”参数(只要名称在表单中应该是唯一的)。

在编写 POST 数据处理时,我注意到主流浏览器发送的多个文件好像来自不同的 <input> 元素,但名称相同。 IE。代替:

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数据?是否有浏览器将多个文件作为“多部分/混合”发送或不需要处理这种情况,我应该简化我的代码吗?

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

最佳答案

我已经证实了你的发现。
我测试了 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 节(我的重点):



所以,你的问题:



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



非常旧的浏览器 可能使用“multipart/mixed”,但无论如何都不推荐使用,因此无需处理这种情况。

我的建议:你绝对应该简化你的代码。

10-08 18:22