with from files example java spring spring-3 content-disposition

java - from - spring download file example



¿Cómo configurar ''Disposición de contenido'' y ''Nombre de archivo'' cuando se usa FileSystemResource para forzar un archivo de descarga de archivos? (5)

¿Cuál es la forma más apropiada y estándar de configurar Content-Disposition=attachment filename=xyz.zip y filename=xyz.zip con Spring 3 FileSystemResource ?

La acción se ve como:

@ResponseBody @RequestMapping(value = "/action/{abcd}/{efgh}", method = RequestMethod.GET, produces = "application/zip") @PreAuthorize("@authorizationService.authorizeMethod()") public FileSystemResource doAction(@PathVariable String abcd, @PathVariable String efgh) { File zipFile = service.getFile(abcd, efgh); return new FileSystemResource(zipFile); }

Aunque el archivo es un archivo zip, el navegador siempre lo descarga, pero me gustaría mencionar explícitamente el archivo como archivo adjunto y también proporcionar un nombre de archivo que no tenga nada que ver con el nombre real de los archivos.

Puede haber soluciones para este problema, pero me gustaría conocer la forma correcta de Spring y FileSystemResource para lograr este objetivo.

PS El archivo que se está utilizando aquí es un archivo temporal, marcado para su eliminación cuando existe la JVM.


Además de la respuesta aceptada, Spring tiene la clase ContentDisposition específica para este propósito. Creo que se trata de la desinfección del nombre de archivo.

ContentDisposition contentDisposition = ContentDisposition.builder("inline") .filename("Filename") .build(); HttpHeaders headers = new HttpHeaders(); headers.setContentDisposition(contentDisposition);


Este es un enfoque alternativo para Spring 4. Tenga en cuenta que este ejemplo claramente no utiliza buenas prácticas con respecto al acceso al sistema de archivos, esto es solo para demostrar cómo algunas propiedades se pueden establecer de forma declarativa.

@RequestMapping(value = "/{resourceIdentifier}", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) // @ResponseBody // Needed for @Controller but not for @RestController. public ResponseEntity<InputStreamResource> download(@PathVariable(name = "resourceIdentifier") final String filename) throws Exception { final String resourceName = filename + ".dat"; final File iFile = new File("/some/folder", resourceName); final long resourceLength = iFile.length(); final long lastModified = iFile.lastModified(); final InputStream resource = new FileInputStream(iFile); return ResponseEntity.ok() .header("Content-Disposition", "attachment; filename=" + resourceName) .contentLength(resourceLength) .lastModified(lastModified) .contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE) .body(resource); }


Hice pocos cambios en las dos respuestas dadas y terminé con lo mejor de ambos en mi proyecto, donde necesitaba extraer una imagen de la base de datos como un blob y luego entregarla a los clientes:

@GetMapping("/images/{imageId:.+}") @ResponseBody public ResponseEntity<FileSystemResource> serveFile(@PathVariable @Valid String imageId,HttpServletResponse response) { ImageEntity singleImageInfo=db.storage.StorageService.getImage(imageId); if(singleImageInfo==null) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); } Blob image=singleImageInfo.getImage(); try { String filename= UsersExtra.GenerateSession()+"xxyy"+singleImageInfo.getImage1Ext().trim(); byte [] array = image.getBytes( 1, ( int ) image.length() ); File file = File.createTempFile(UsersExtra.GenerateSession()+"xxyy", singleImageInfo.getImage1Ext().trim(), new File(".")); FileOutputStream out = new FileOutputStream( file ); out.write( array ); out.close(); FileSystemResource testing=new FileSystemResource(file); String mimeType = "image/"+singleImageInfo.getImage1Ext().trim().toLowerCase().replace(".", ""); response.setContentType(mimeType); String headerKey = "Content-Disposition"; String headerValue = String.format("attachment; filename=/"%s/"", filename); response.setHeader(headerKey, headerValue); // return new FileSystemResource(file); return ResponseEntity.status(HttpStatus.OK).body( new FileSystemResource(file)); }catch(Exception e) { System.out.println(e.getMessage()); } return null; }

El uso de una ResponseEntity en el código de Kumar le ayudará a responder con el código de respuesta correcto. Nota: la conversión de un blob a un archivo se cita desde este enlace: Fragmento para crear un archivo a partir del contenido de un blob en Java


@RequestMapping(value = "/action/{abcd}/{efgh}", method = RequestMethod.GET) @PreAuthorize("@authorizationService.authorizeMethod(#id)") public HttpEntity<byte[]> doAction(@PathVariable ObjectType obj, @PathVariable Date date, HttpServletResponse response) throws IOException { ZipFileType zipFile = service.getFile(obj1.getId(), date); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getFileName()); return new HttpEntity<byte[]>(zipFile.getByteArray(), headers); }


@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET) @ResponseBody public FileSystemResource getFile(@PathVariable("file_name") String fileName,HttpServletResponse response) { response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=somefile.pdf"); return new FileSystemResource(new File("file full path")); }