2016-03-21 272 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