4

我有一个带有上传字段的 ExtJs 表单。当我提交表单时,Accept-header 是错误的。响应是 JSON,但发送的 Accept-header 是:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

我有根据的猜测是它是浏览器的默认值。

在 Chrome 中,这会导致警告:资源解释为文档,但使用 MIME 类型应用程序/json 传输。

在 FireFox 中,这会导致文件下载。

结论:我必须将 Accept-header 更改/设置为application/json

Sencha 的文档说它有一个headers参数,但我已经测试过,对于文件上传它不起作用。有评论说不支持。(在另一个线程中发现相同的结果)

摆脱文件下载/设置正确的Accept-header的任何建议......它不一定是ExtJs解决方案。如果你能给我一个简单的 javaScript 解决方案来在文件上传表单上设置接受标头,我可能可以将它塑造成 sencha 框架。

更新:

ExtJS 表单提交:

form.submit({
    url: API_URLS.addDocument,
    waitMsg: 'Uploading your document...',
    headers: {
        "Accept": 'application/json' //doesn't work
    },
    success: function() {
        ...
    },
    failure: function(){
        ...
    }
});

在幕后,它创建了一个与此类似的普通表单:

<form action="API_URLS.addDocument" enctype="multipart/form-data" method="post">
    <input type="file"/>
</form>

可以通过javaScript( submit())提交

4

1 回答 1

6

Accept头只是要求服务器以给定类型的数据进行响应。默认标题*中的 表示“或其他任何东西”(尽管 q 值的优先级低于此)。

如果响应是 JSON 并且您想要 JSON,那么您根本不需要触摸 Accept 标头。

问题是,如果我在两行之间正确阅读,您正在尝试使用 iframe 执行 Ajax 文件上传,而 Firefox 不会尝试将 JSON 文件呈现为文档。

有两种方法可以解决这个问题。

  1. 将响应呈现为 HTML 而不是 JSON,然后使用 DOM 从中提取数据
  2. 使用XMLHttpRequest 2 和 File API上传文件而不是 iframe。(注意:这使用了浏览器支持有限的新 API)。
于 2012-11-12T14:16:16.677 回答