下载文件 Safari

Posted

技术标签:

【中文标题】下载文件 Safari【英文标题】:Download file Safari 【发布时间】:2017-07-18 12:47:59 【问题描述】:

我正在尝试触发文件下载,但在 Safari 上执行此操作时遇到问题(FireFox 和 Chrome 可以正常工作)。 这是我的 Java 代码:

  @RequestMapping(method = RequestMethod.GET, produces = "text/csv")
  @ResponseBody
  public String getReports(
      final HttpServletResponse response,
      final @RequestParam String data) throws ParseException 
    response.setHeader("Content-type", "text/csv; charset=utf-8");
    response.setHeader("Content-Disposition","attachment; filename='view.csv'");
    String csv = exportCurrentService.extractMatrix(data);
    response.setContentLength(csv.length());

    return csv;
  

这是我的客户端代码:

  downloadURI(url, name) 
    const a = document.createElement('a');
    a.href = url;
    a.download = name;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  

在 Safari 中,响应打印在屏幕上(加载在同一页面上)。

注意:我已经尝试过 SO 上建议的其他方法,但每种方法都有自己的问题。

更新: 在响应标头中,我看到 Content-Disposition 设置为内联而不是附件。为什么会这样?

我做错了什么?

【问题讨论】:

您可以使用 Safari 中的网络检查器获取请求和响应标头,并将它们添加到您的问题中吗? Content-Type: text/csv 更改为Content-Type: application/octet-stream 对您有什么帮助吗? 它下载但没有文件扩展名和文件名(在所有浏览器中) 您安装了 MS Office 吗?您使用的是什么操作系统? 是的。 Mac 操作系统.... 【参考方案1】:

这不会编译,它只是代表你应该做什么。

response.setContentType("application/force-download");
response.setContentLength((int)f.length());
        //response.setContentLength(-1);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition","attachment; filename=\"" + "xxx\"");//fileName);
...
...
File f= new File(fileName);

InputStream in = new FileInputStream(f);
BufferedInputStream bin = new BufferedInputStream(in);
DataInputStream din = new DataInputStream(bin);

while(din.available() > 0)
    out.print(din.readLine());
    out.print("\n");
    //this is from another answer I saw awhile ago while trying to do the same thing

这是我在尝试做同样的事情时看到的另一篇帖子。原作者是 Vineet Reynolds。 我是 SO 新手,所以如果这是不好的做法,请通知我。

【讨论】:

【参考方案2】:

尝试不使用@ResponseBody 和使用produces = MediaType.APPLICATION_JSON_UTF8_VALUE

【讨论】:

但我希望它是 csv,而不是 json 您可以尝试使用您的类型(文本/csv)。使用 @ResponseBody 注释,您将 Content-type 标头设置为 text/plain。看看:***.com/a/30549204/7604006 我已经尝试过了,但似乎 Content-Disposition 设置为内联,(我在响应标头中看到它的开发工具)。【参考方案3】:

我的服务被放置在一个路由模块(它是所有微服务的代理)之后。问题出在这个模块(代理)中,它覆盖了微应用服务的标头和 cookie。

按照问题中的描述设置代码就可以了。

【讨论】:

以上是关于下载文件 Safari的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Safari 浏览器中下载 ICS 文件

在 Safari 5.1.7 中下载 PDF 文件

Safari 5.1.7 下载文件名未知的 csv 文件

java中针对safari下载pdfexcelword等文档变成exe文件解决办法

加载资源失败:下载多个文件时,Safari 浏览器中的帧加载中断

使用 Safari 下载数据 URL