Heim  >  Artikel  >  Java  >  So laden Sie eine Datei von einem Spring Boot REST-Dienst herunter: Warum schlägt InputStreamReader fehl und wie lässt sich das Problem mit InputStreamResource oder ByteArrayResource beheben?

So laden Sie eine Datei von einem Spring Boot REST-Dienst herunter: Warum schlägt InputStreamReader fehl und wie lässt sich das Problem mit InputStreamResource oder ByteArrayResource beheben?

Susan Sarandon
Susan SarandonOriginal
2024-11-02 07:37:02259Durchsuche

How to Download a File from a Spring Boot REST Service: Why InputStreamReader Fails and How to Fix It with InputStreamResource or ByteArrayResource?

Herunterladen einer Datei vom Spring Boot REST-Dienst

Dieser Artikel befasst sich mit dem Problem des effektiven Herunterladens einer Datei von einem Spring Boot REST-Dienst. Der unten bereitgestellte Code versucht, diese Funktionalität zu ermöglichen:

<code class="java">@RequestMapping(path="/downloadFile",method=RequestMethod.GET)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
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));
        System.out.println("The length of the file is : "+file2Upload.length());

        return ResponseEntity.ok().headers(headers).contentLength(file2Upload.length())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(i);
        }</code>

Beim Versuch, die Datei über einen Browser herunterzuladen, wird der Vorgang zwar gestartet, schlägt jedoch letztendlich fehl. Die folgenden Optionen können untersucht werden, um dieses Problem zu beheben:

Option 1: Verwendung einer InputStreamResource

Eine InputStreamResource kann zur Darstellung eines InputStreams verwendet werden. Dies sollte in Betracht gezogen werden, wenn andere spezifische Ressourcenimplementierungen nicht anwendbar sind.

<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

Wie in der Dokumentation für InputStreamResource empfohlen, eine ByteArrayResource kann auch angestellt werden.

<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>

Das obige ist der detaillierte Inhalt vonSo laden Sie eine Datei von einem Spring Boot REST-Dienst herunter: Warum schlägt InputStreamReader fehl und wie lässt sich das Problem mit InputStreamResource oder ByteArrayResource beheben?. 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