JSON XHR响应打开下载文件弹出窗口

14

我们的一个ajax请求(响应类型为.json)有些客户抱怨他们看到了一个“文件下载”提示,要求用户下载.json响应。我感到迷惑,因为考虑到这是一个xhr响应,这不应该发生。有人见过这种情况吗?

谢谢。


为什么要将 .json 添加为文件扩展名?我认为除非您设置浏览器针对 .json 文件执行特定操作(在 FF 中转到选项),否则无法这样做。 - nightingale2k1
5个回答

16

对于使用ASP MVC并在IE上遇到相同问题的人,当返回响应时,请使用以下代码:

return Json(result, "text/plain");

编辑:标准类型是:"application/json",但在 IE 上不起作用。使用 text/html 是危险的。


比@jrharshath的答案更好,因为text/plain在技术上并不正确。这是对旧版IE的一种粗略的黑客方法。 - Mark E. Haase

11

尝试在响应中指定"MIME类型"为"text/plain"。或者只需从URL中删除".json"扩展名(例如尝试使用.txt或.js)。


请确保在指定 MIME 类型为 text/plain 以外的其他类型时,不要在代码中任何其他地方设置标头。 - jellyfishtree
假设您对响应具有控制权。那么如何调用一个第三方 Web 服务,该服务以 JSON 格式响应,而内容类型设置为 "json"(上帝禁止)? - phtrivier
是的,将ContentType从application/json更改为text/html对我有用。我写了一篇关于它的博客文章,其中包含更多细节: http://blog.degree.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/ - Andreas

3

不确定您是否已经找到解决方案,但我曾遇到类似的问题,即IE尝试下载任何JS响应。为了解决这个问题,我必须确保在响应块中format.js出现之前出现format.html:

def index

  # ...

  respond_to do |format|
    # html must be above js, otherwise IE will try to download the JS
    format.html
    format.js
  end
end

希望这可以帮到你。

这个解决方案对我有效。不知道为什么(其他浏览器都工作正常)。 - Kyle Fox
IE的Accept头部:Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, */*Firefox的Accept头部:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8还不确定q=是什么意思,但我敢打赌它与想要特定类型的内容有关。 - Peter Kovacs

1
我正在使用QQ ajax文件上传器,发现我需要将内容类型设置为"text/json"才能正常工作。

我尝试过这个,但对我没有用。IE7试图下载指定为端点的php文件。 - Saul Berardo

-3
去掉 .json 后,将内容类型设置为 text/html。IE 不知道你正在发送什么类型的文件,所以它会提供下载选项。但是它知道如何处理 text/html :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接