2016-03-21 10 views
2

Ich muss Datei vom Server über Ajax herunterladen. Das Problem ist, dass die Datei nicht auf dem Server gespeichert ist. Mein Java-basierte Backend generiert automatisch Datei von Anforderungsparameter und gibt sie als Antwort Körper:Dateidownload durch 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); 
    } 
    } 

Also muss ich es zu handhaben und ermöglichen User-Datei zum Download bereit. Meine Client-Seite enthält diese:

$.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(); 
    } 
}) 

Controller-Datei zurückgibt, aber dann passiert nichts. Was mache ich falsch?

Antwort

5

Erstellen Sie keinen AJAX-Aufruf, sondern legen Sie fest, dass der href des Fensters auf URL verweist, um die Datei herunterzuladen. Dann wird der Inhalt ändern Art der Reaktion auf application/x-download und stellen Sie den Header der Antwort Content-disposition sein:

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"; 
} 

Auch einen Blick auf this SO post haben, die ein ähnliches Problem mit dem einen Adressen, die Sie haben.

+1

Okay, aber was muss ich tun, wenn ich Post-Anfrage statt bekommen und looong String-Parameter übergeben soll? – Everv0id

+0

Diese Methode funktioniert nicht für POST. Aber warum änderst du deine Frage jetzt? –

+1

Ihre Antwort funktioniert perfekt in meinem speziellen Fall. Ich versuche nur, tiefer zu graben. – Everv0id

Verwandte Themen