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!