客户端将多部分/表单数据请求的文件部分的内容类型设置错误
Content type for file part of the multipart/form-data request is set wrong by the client
我正在尝试使用以下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
,然后在服务器端正确处理。
相关文章:
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 在<输入类型=“;文件“/>
- 如何使用javascript获取从指定文件夹创建的所有文件的名称、大小、类型和日期
- 将大数组(字符串和类型数组的混合物)存储到blob或文件中/从blob或文件检索大数组的最佳方式
- Javascript-上传文件内容类型验证
- JQuery 文件附件: 类型错误: $(..) 为空
- 无法创建 Sencha Touch 2 jsb3 文件,类型错误:“未定义”
- CocoonJS和Panda.js-配置文件图片类型的事情是可能的
- Angular+TypeScript+外部模块.如何跨文件维护类型信息
- 如何读取节点中MDB文件中类型为doubles的列
- 如何在没有表单提交的情况下使用jquery从文件输入类型中获取文件名
- 使用文件输入类型发送图像到服务器
- 在javascript中为所有文件输入类型运行函数
- javascript:需要上传文件","类型":" oautheexception Facebook用户已经注册
- 如何使用jQuery获取用户选择文件的类型
- JS和类型.匹配文件mime类型-需要通知
- 验证文件输入类型是否强制出现在html中
- 多个文件组成类型脚本项目
- AJAX发送的jquery FormData中未包含文件输入类型
- jQuery验证器不能为文件输入类型工作