2016-03-21 241 views
2

我需要通过ajax从服务器上下载文件。问题是该文件不存储在服务器上。我的基于java后台自动从请求参数生成文件,并在响应体返回它:通过ajax下载文件

@RequestMapping(value = "/download", method = RequestMethod.GET) 
    public void download(@RequestParam String description, @RequestParam Long logId, HttpServletResponse response) { 
    try { 
     InputStream fileContent = // getting file as byte stream 
     response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); 
     response.setHeader("Content-Disposition", "attachment; filename=file.zip"); 
     ServletOutputStream responseOutputStream = response.getOutputStream(); 
     org.apache.commons.io.IOUtils.copy(fileContent, responseOutputStream); 
     response.flushBuffer(); 
    } catch (IOException e) { 
     logger.error("Attempt to download file failed", e); 
    } 
    } 

,所以我需要处理,并允许用户下载文件。 我的客户端包含此:

$.ajax({ 
    type: "GET", 
    url: "/download", 
    data: { 
    description: "test", 
    logId: 123 
    }, 
    success: function(data) { 
    var blob = new Blob([data]); 
    var link = document.createElement('a'); 
    link.href = window.URL.createObjectURL(blob); 
    link.download = "file.zip"; 
    link.click(); 
    } 
}) 

控制器返回文件,但后来什么也没有发生。我究竟做错了什么?

回答

5

不要进行AJAX调用,而是将窗口的href设置为指向下载文件的URL。然后改变响应的内容类型application/x-download并设置响应的头是Content-disposition

response.setContentType("application/x-download"); 
response.setHeader("Content-disposition", "attachment; filename=" + fileName); 
response.flushBuffer(); 

function download(fileName) { 
    window.location.href = "/download?description=test&logId=123"; 
} 

而且,看看this SO post它解决了类似的问题,你有一个。

+1

好的,但我需要做什么,如果我想要发布请求而不是获取并传递looong字符串参数? – Everv0id

+0

此方法不适用于POST。但是,你为什么现在改变你的问题? –

+1

您的回答在我的特定情况下完美运行。我只是想深入挖掘。 – Everv0id