Heim  >  Artikel  >  Java  >  Warum schlägt der Download meines Spring Boot REST-Dienstes fehl, obwohl der Browser den Vorgang initiiert?

Warum schlägt der Download meines Spring Boot REST-Dienstes fehl, obwohl der Browser den Vorgang initiiert?

Barbara Streisand
Barbara StreisandOriginal
2024-10-27 17:47:31278Durchsuche

 Why is my Spring Boot REST service download failing, despite the browser initiating the process?

Eine Datei vom Spring Boot Rest Service herunterladen: Fehlerbehebung bei fehlgeschlagenen Downloads

Dieser Artikel befasst sich mit einem Problem, das beim Versuch auftritt, eine Datei über einen herunterzuladen Spring Boot REST-Dienst. Trotz der Einleitung des Downloads im Browser schlägt der Vorgang immer wieder fehl. Hier ist eine Analyse des Problems und mögliche Lösungen:

Die Servicemethode:

Der bereitgestellte Code demonstriert die Servicemethode, die für das Herunterladen der Datei verantwortlich ist:

<code class="java">@RequestMapping(path="/downloadFile",method=RequestMethod.GET)
public ResponseEntity<InputStreamReader> downloadDocument(String acquistionId, String fileType, Integer expressVfId) throws IOException {
    File file2Upload = new File("C:\Users\admin\Desktop\bkp\1.rtf");
    HttpHeaders headers = new HttpHeaders();
    headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
    headers.add("Pragma", "no-cache");
    headers.add("Expires", "0");
    InputStreamReader i = new InputStreamReader(new FileInputStream(file2Upload));
    return ResponseEntity.ok().headers(headers).contentLength(file2Upload.length())
            .contentType(MediaType.parseMediaType("application/octet-stream"))
            .body(i);
}</code>

Option 1: Verwendung einer InputStreamResource

Der bereitgestellte Code erstellt einen InputStreamReader aus einer Datei und gibt ihn mit einer ResponseEntity zurück. Es wird jedoch empfohlen, eine InputStreamResource aus der Spring-Core-Bibliothek zu verwenden. Diese Implementierung bietet eine Ressource für Streams und stellt die ordnungsgemäße Handhabung des Streams während des Downloadvorgangs sicher.

<code class="java">@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {
    InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(resource);
}</code>

Option 2: Verwendung einer ByteArrayResource

Die Spring-Dokumentation schlägt vor Verwendung einer ByteArrayResource anstelle einer InputStreamResource. Die Verwendung dieses Ressourcentyps erfordert das Einlesen der gesamten Datei in ein Byte-Array und das Erstellen einer Ressource daraus. Dieser Ansatz kann in bestimmten Szenarien von Vorteil sein, beispielsweise bei einer verbesserten Leistung für kleine Dateien.

<code class="java">@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {
    Path path = Paths.get(file.getAbsolutePath());
    ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));
    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(resource);
}</code>

Durch die Implementierung einer dieser Optionen sollte das Problem mit Download-Fehlern behoben werden und nahtlose Datei-Downloads über Spring Boot ermöglicht werden REST-Service.

Das obige ist der detaillierte Inhalt vonWarum schlägt der Download meines Spring Boot REST-Dienstes fehl, obwohl der Browser den Vorgang initiiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn