【问题标题】:Content-Disposition file extension not properly working on FirefoxContent-Disposition 文件扩展名在 Firefox 上无法正常工作
【发布时间】:2013-08-03 20:23:04
【问题描述】:

我在 Spring Controller 上有以下代码

@RequestMapping(value = "/download", method = RequestMethod.POST)
 public void downloadActive(@RequestParam(value = "type") String offerType, HttpServletResponse response,
            HttpSession session) throws Exception {

 StringBuilder b = new StringBuilder();.
.
.

response.addHeader("Content-Disposition: ", "attachment; filename=my" + offerType + "Offers.csv");
response.getWriter().write(b.toString());
..

}

当点击来自 EXt Js 的下载按钮时,该代码将被执行。在 chrome 上,它直接将文件下载为 *.csv 格式,当用户打开它时,它会自动使用 Excel 打开文件,如果他们已经安装并且这是我想要的正确行为。

但是,在 Firefox 上,它会提示一个另存为窗口,其中包含打开方式和保存选项。如果我使用 open with 选项,它会告诉我文件名是 filename.csv 但类型是 chrome htm 文件。我没有在我的代码中的任何地方提到 htm,我不知道为什么它试图将它作为 htm 而不是 csv 文件打开。一旦它试图打开它,它就会带来 excel 应用程序,并且内容格式错误。

有没有办法在 Firefox 上避免这个问题?

谢谢

【问题讨论】:

  • 获取 HTTP 跟踪并向我们显示所有响应标头字段。
  • 今晚早些时候我遇到了这个问题,这个帖子中的其他建议都没有奏效。就我而言,它是要下载的 XLSX 文件。除 Firefox 之外的所有浏览器似乎都可以正常工作。我也像你一样使用 Spring MVC。我扩充了 produces 注释以包含 Excel MIME 类型,现在它正在修复 Firefox 中的问题。在我的情况下,这意味着控制器注释:@RequestMapping(method = RequestMethod.POST, produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")

标签: java spring-mvc csv browser content-disposition


【解决方案1】:

为文件名添加双引号 (") 可以解决问题。

response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "");

【讨论】:

  • 今晚早些时候我遇到了这个问题,并尝试按照您的建议应用双引号修复,尽管它没有任何区别。另请注意,文件名后面的引号实际上是"\"",而不是""
【解决方案2】:

即使我不确定它为什么起作用,将 addHeader 方法更改为 setHeader 也可以解决问题。

response.setHeader("Content-Disposition: ", "attachment; filename=my" + offerType + "Offers.csv");

【讨论】:

  • 我很确定标题名称参数中的尾随“:”不正确。另外,您要设置 Content-Type。
【解决方案3】:
PrintWriter printWriter = resourceResponse.getWriter();
java.util.Date date = new java.util.Date();
resourceResponse.setContentType("text/csv");
resourceResponse.addProperty(HttpHeaders.CACHE_CONTROL,
        "max-age=0, must-revalidate");
resourceResponse.setProperty(
        HttpHeaders.CONTENT_DISPOSITION,
        "attachment; filename=" + "export_build" + "_"
                + date.getTime() + ".csv");
printWriter.write(stringBuilder.toString());

确保在打印header后写入内容,以确保内容正确打包在文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多