Télécharger un fichier à partir du service Spring Boot Rest : dépannage des échecs de téléchargement
Cet article traite d'un problème rencontré lors de la tentative de téléchargement d'un fichier via un Service REST de démarrage printanier. Malgré le lancement du téléchargement dans le navigateur, le processus échoue systématiquement. Voici une analyse du problème et des solutions potentielles :
La méthode de service :
Le code fourni démontre la méthode de service responsable du téléchargement du fichier :
<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 : Utiliser un InputStreamResource
Le code fourni crée un InputStreamReader à partir d'un fichier et le renvoie avec un ResponseEntity. Cependant, il est recommandé d'utiliser un InputStreamResource de la bibliothèque spring-core. Cette implémentation offre une ressource pour les flux, garantissant une gestion appropriée du flux pendant le processus de téléchargement.
<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 : Utiliser une ByteArrayResource
La documentation Spring suggère en utilisant un ByteArrayResource au lieu d'un InputStreamResource. L'utilisation de ce type de ressource implique de lire l'intégralité du fichier dans un tableau d'octets et de créer une ressource à partir de celui-ci. Cette approche peut être avantageuse dans certains scénarios, tels que l'amélioration des performances pour les petits fichiers.
<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>
En implémentant l'une ou l'autre de ces options, le problème des échecs de téléchargement devrait être résolu, permettant ainsi des téléchargements de fichiers transparents via Spring Boot. Service REST.
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!