我正在尝试使用以下JavaScript和jQuery发送multipart / form-data:
var formData = new FormData();
formData.append("projectName", $("#projectNameInput").val());
var file = $("#fileInput")[0].files[0];
formData.append("content", file);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/project', true);
xhr.onload = function(ev) {
// Handling logic omitted
};
xhr.send(formData);
但是,某些客户端浏览器(Firefox和Chrome)从服务器接收到400错误请求.在检查标头和请求有效负载时,我发现某些浏览器为文件设置了显式的内容类型,如下所示:
------WebKitFormBoundaryEuDIpEU2Ci8VNwNJ
Content-Disposition: form-data; name="content"; filename="testfile.ext"
Content-Type: EXT Project Data (64bit)
------WebKitFormBoundaryEuDIpEU2Ci8VNwNJ
在工作请求中,Content-Type应该如下:Content-Type:服务器可以正确处理的application / octet-stream.
我怀疑这与浏览器的配置或文件关联有关.有没有一种方法可以显式设置请求的文件部分的内容类型?
使用Firefox和Chrome的某些用户会出现此问题.但是,某些用户可以使用Chrome和Firefox成功上传.我们的应用程序不支持IE.
解决方法:
好的,我们设法解决了这个问题.原来,注册到客户端系统的内容类型在某些安装了某些第三方应用程序的客户端计算机上实际上是错误的.
我们无法以编程方式更改零件的浏览器集的内容类型.
正如Michael-O所指出的,您应该始终使用在IANA中注册的内容类型.这是标准的link.
在这种情况下,是第三方软件向客户端系统注册了非法内容类型.内容类型不能包含空格,因此内容类型EXT Project Data显然是非法的.我们通过将注册的内容类型更改为custom content type来解决了该问题.因此,我们现在使用的内容类型是application / x-ext-project-data,然后可以在服务器端对其进行正确处理.