Maison > Java > javaDidacticiel > Comment télécharger un fichier à partir d'un service REST Spring Boot : pourquoi InputStreamReader échoue et comment y remédier avec InputStreamResource ou ByteArrayResource ?

Comment télécharger un fichier à partir d'un service REST Spring Boot : pourquoi InputStreamReader échoue et comment y remédier avec InputStreamResource ou ByteArrayResource ?

Susan Sarandon
Libérer: 2024-11-02 07:37:02
original
384 Les gens l'ont consulté

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

Téléchargement d'un fichier à partir du service REST Spring Boot

Cet article aborde efficacement le problème du téléchargement d'un fichier à partir d'un service REST Spring Boot. Le code fourni ci-dessous tente de faciliter cette fonctionnalité :

<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>
Copier après la connexion

Cependant, lors de la tentative de téléchargement du fichier via un navigateur, le processus démarre mais échoue finalement. Les options suivantes peuvent être explorées pour résoudre ce problème :

Option 1 : Utiliser un InputStreamResource

Un InputStreamResource peut être utilisé pour représenter un InputStream. Cela doit être pris en compte lorsque d'autres implémentations de ressources spécifiques ne sont pas applicables.

<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>
Copier après la connexion

Option 2 : Utiliser un ByteArrayResource

Comme recommandé par la documentation d'InputStreamResource, un ByteArrayResource peut également être employé.

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal