3

我正在尝试multipart/form-data使用以下 JavaScript 和 jQuery 发送:

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。

4

1 回答 1

4

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

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

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

于 2012-07-20T07:18:36.687 回答