背景:
根据 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”,但无论如何都不推荐使用,因此无需处理这种情况。
我的建议:你绝对应该简化你的代码。