客户端将多部分/表单数据请求的文件部分的内容类型设置错误

Content type for file part of the multipart/form-data request is set wrong by the client

本文关键字:文件部 类型 错误 设置 请求 多部 表单 数据 客户端      更新时间:2023-09-26

我正在尝试使用以下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。

好的,我们设法解决了这个问题。事实证明,注册到客户端系统的内容类型实际上在某些安装了某些第三方应用程序的客户端计算机上格式不正确。

我们无法以编程方式更改该部件的内容类型浏览器集。正如 Michael-O 所指出的,您应该始终使用在 IANA 注册的内容类型。这是该标准的链接。

在这种情况下,是第三方软件将非法内容类型注册到客户端系统。内容类型不能包含空格,因此内容类型EXT Project Data显然是非法的。我们通过将注册的内容类型更改为自定义内容类型来修复此问题。所以我们现在使用的内容类型是 application/x-ext-project-data ,然后在服务器端正确处理。