453 Stimmen

Herunterladen einer Datei von Spring Controllern

Ich habe eine Anforderung, bei der ich eine PDF-Datei von der Website herunterladen muss. Das PDF muss innerhalb des Codes generiert werden. Ich dachte, das wäre eine Kombination aus Freemarker und einem PDF-Generierungs-Framework wie iText. Gibt es einen besseren Weg?

Mein Hauptproblem ist jedoch, wie kann ich dem Benutzer erlauben, eine Datei über einen Spring Controller herunterladen?

3voto

xxy Punkte 958

Etwas wie unten

@RequestMapping(value = "/download", method = RequestMethod.GET)
public void getFile(HttpServletResponse response) {
    try {
        DefaultResourceLoader loader = new DefaultResourceLoader();
        InputStream is = loader.getResource("classpath:META-INF/resources/Accepted.pdf").getInputStream();
        IOUtils.copy(is, response.getOutputStream());
        response.setHeader("Content-Disposition", "attachment; filename=Accepted.pdf");
        response.flushBuffer();
    } catch (IOException ex) {
        throw new RuntimeException("IOError writing file to output stream");
    }
}

Sie können PDF anzeigen oder Beispiele herunterladen aquí

2voto

Sagar Nair Punkte 107

Falls es jemandem hilft. Sie können tun, was die akzeptierte Antwort von Infeligo vorgeschlagen hat, aber nur dieses zusätzliche Bit in den Code für einen erzwungenen Download setzen.

response.setContentType("application/force-download");

1voto

In meinem Fall generiere ich eine Datei bei Bedarf, also muss auch die URL generiert werden.

Bei mir funktioniert das in etwa so:

@RequestMapping(value = "/files/{filename:.+}", method = RequestMethod.GET, produces = "text/csv")
@ResponseBody
public FileSystemResource getFile(@PathVariable String filename) {
    String path = dataProvider.getFullPath(filename);
    return new FileSystemResource(new File(path));
}

Sehr wichtig ist der Mime-Typ in produces und auch, dass der Name der Datei Teil des Links ist, also muss man @PathVariable .

Der HTML-Code sieht so aus:

<a th:href="@{|/dbreport/files/${file_name}|}">Download</a>

Wo ${file_name} wird von Thymeleaf im Controller generiert und lautet z.B.: result_20200225.csv, so dass die gesamte Url hinter dem Link lautet: example.com/aplication/dbreport/files/result_20200225.csv .

Nachdem ich auf den Link geklickt habe, fragt mich der Browser, was ich mit der Datei machen soll - speichern oder öffnen.

1voto

Inanc Cakil Punkte 137

Ich musste dies hinzufügen, um eine Datei herunterzuladen

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition",
            "attachment;filename="+"file.txt");

alle Codes:

@Controller
public class FileController {

@RequestMapping(value = "/file", method =RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(HttpServletResponse response) {

    final File file = new File("file.txt");
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition",
            "attachment;filename="+"file.txt");
    return new FileSystemResource(file);
 }
}

0voto

theNextBigThing Punkte 101

Dies kann eine nützliche Antwort sein.

Ist es in Ordnung, die Daten im Frontend im PDF-Format zu exportieren?

Durch Hinzufügen von "content-disposition" als Anhang (Standard) wird die Datei heruntergeladen. Wenn Sie sie anzeigen möchten, müssen Sie sie auf "inline" setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X