2016-03-21 5 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呼び出しを行うのではなく、ファイルをダウンロードするためのURLをポイントするようにウィンドウのhrefを設定します。その後Content-dispositionするapplication/x-downloadへの応答のコンテンツタイプを変更し、レスポンスのヘッダを設定します。

また
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

関連する問題