Laden Sie ein Bild oder eine Datei mit Spring MVC herunter

1. Überblick

Die Zustellung statischer Dateien an den Client kann auf verschiedene Arten erfolgen. Die Verwendung eines Spring Controllers ist nicht unbedingt die beste verfügbare Option.

Manchmal ist jedoch die Controller-Route notwendig - und darauf konzentrieren wir uns in diesem kurzen Artikel.

2. Verwenden von @ ResponseBody

Die erste unkomplizierte Lösung besteht darin, die Annotation @ ResponseBody für eine Controller-Methode zu verwenden, um anzugeben, dass das von der Methode zurückgegebene Objekt direkt an den HTTP-Antwort-Body übergeben werden soll:

@GetMapping("/get-text")
public @ResponseBody String getText() {
    return "Hello world";
}

Daher gibt diese Methode nur die Zeichenfolge Hello world zurück, anstatt eine Ansicht mit dem Namen Hello world zurückzugeben, wie bei einer typischen MVC-Anwendung.

Mit @ ResponseBody können wir so ziemlich jeden Medientyp zurückgeben, solange wir einen entsprechenden HTTP-Nachrichtenkonverter haben, der das verarbeiten und in den Ausgabestrom stellen kann.

3. Verwenden von produces zum Zurückgeben von Bildern

Die Rückgabe von Byte-Arrays ermöglicht es uns, nahezu alles zurückzugeben - beispielsweise Bilder oder Dateien:

@GetMapping(value = "/image")
public @ResponseBody byte[]getImage() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

Hier definieren wir nicht, dass das zurückgegebene Byte-Array ein Bild ist.

Daher kann der Client dies nicht als Bild behandeln - und der Browser zeigt höchstwahrscheinlich nur die tatsächlichen Bytes des Bildes an.

Um zu definieren, dass das zurückgegebene Byte-Array einem Bild entspricht, können Sie das produces -Attribut der Annotation @ GetMapping setzen, um den MIME-Typ des zurückgegebenen Objekts genau zu bestimmen:

@GetMapping(
  value = "/get-image-with-media-type",
  produces = MediaType.IMAGE__JPEG__VALUE
)
public @ResponseBody byte[]getImageWithMediaType() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

Hier ist produces auf MediaType.IMAGE JPEG VALUE gesetzt, um anzuzeigen, dass das zurückgegebene Objekt als JPEG-Bild behandelt werden muss.

Jetzt erkennt der Browser den Antworttext als Bild und zeigt ihn ordnungsgemäß an.

4. Verwenden von produces zur Rückgabe von Rohdaten

Der Parameter produces kann auf viele verschiedene Werte gesetzt werden (die vollständige Liste ist hier ) abhängig von der Art des Objekts, das wir zurückgeben möchten.

Wenn Sie also eine Rohdatei zurückgeben möchten, können Sie einfach APPLICATION OCTET STREAM VALUE__ verwenden:

@GetMapping(
  value = "/get-file",
  produces = MediaType.APPLICATION__OCTET__STREAM__VALUE
)
public @ResponseBody byte[]getFile() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/data.txt");
    return IOUtils.toByteArray(in);
}

5. Schlussfolgerung

In diesem kurzen Artikel haben wir uns ein einfaches Problem angesehen - das Zurückgeben von Bildern oder Dateien von einem Spring Controller.

Und wie immer ist der Beispielcode zu finden unter over on Github .