2017-02-27 86 views
8

我试图触发文件下载,并且我在Safari上遇到问题(FireFox & Chrome按预期工作)。
这里是我的Java代码:下载文件Safari

@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被设置为内联而不是附件。为什么发生这种情况?

我做错了什么?

+0

您可以在Safari中使用Web检查器来获取请求和响应标题,并将它们添加到您的问题中? – Stobor

+0

是否将'Content-Type:text/csv'改为'Content-Type:application/octet-stream'为你做任何事情? – d3L

+0

它下载但没有文件扩展名和文件名(在所有浏览器中) – vlio20

回答

0

我的服务是放在后面路由模块(这是所有微服务代理)。问题出在这个模块(代理)上,它覆盖了微应用服务的头文件和cookie。

设置问题中描述的代码做了诀窍。

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 
} 

这是从另一篇文章,当我尝试做同样的事情时看到。原作者是维内特雷诺兹。 我是新来的所以请告诉我,如果这是不好的做法。

1

尝试没有@ResponseBodyproduces = MediaType.APPLICATION_JSON_UTF8_VALUE

+0

但我希望它作为csv而不是json – vlio20

+0

您可以尝试使用您的类型(text/csv) 使用@ResponseBody注释将Content-type标头设置为text/plain。 看一看:http://stackoverflow.com/a/30549204/7604006 – NikNik

+0

我已经尝试过,但似乎内容处置设置为内联,(我看到它的开发工具响应标题)。 – vlio20