根据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的框架,因此不能使用其他库和框架。
答案 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;但无论如何都不推荐使用,所以不需要处理这种情况。
我的建议:你一定要简化你的代码。