我正在尝试使用以下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 Bad Request
。在检查标头和请求有效负载时,我发现某些浏览器为文件设置了明确的内容类型,如下所示:
------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。
答案 0 :(得分:4)
好的,我们设法解决了这个问题。事实证明,在某些客户端计算机上注册到客户端系统的内容类型实际上是格式错误的,这些客户端计算机上安装了某些第三方应用程序。
我们无法以编程方式更改该部件的内容类型浏览器集。 正如Michael-O指出的那样,您应该始终使用在IANA注册的内容类型。这是标准的link。
在这种情况下,第三方软件向客户的系统注册了非法内容类型。内容类型可能不包含空格,因此内容类型EXT Project Data
显然是非法的。我们通过将注册的内容类型更改为custom content type来解决此问题。因此,我们现在使用的内容类型是application/x-ext-project-data
,然后在服务器端正确处理。