下载文件 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的主要内容,如果未能解决你的问题,请参考以下文章
java中针对safari下载pdfexcelword等文档变成exe文件解决办法