Descargar una imagen o un archivo con Spring MVC

1. Información general

La entrega de archivos estáticos al cliente se puede realizar de varias formas, y el uso de un controlador Spring no es necesariamente la mejor opción disponible.

Sin embargo, a veces la ruta del controlador es necesaria, y eso es en lo que nos centraremos en este artículo rápido..

2. Dependencias de Maven

Primero, necesitaremos agregar una dependencia a nuestro pom.xml :

 org.springframework.boot spring-boot-starter-web 

Eso es todo, no necesitamos nada más aquí. Para obtener información sobre la versión, diríjase a Maven Central.

3. Usando @ResponseBody

La primera solución sencilla es usar la anotación @ResponseBody en un método de controlador para indicar que el objeto devuelto por el método debe calcularse directamente en el cuerpo de respuesta HTTP:

@GetMapping("/get-text") public @ResponseBody String getText() { return "Hello world"; } 

Por lo tanto, este método simplemente devolverá la cadena Hola mundo en lugar de devolver una vista cuyo nombre es Hola mundo , como una aplicación MVC más típica.

Con @ResponseBody podemos devolver prácticamente cualquier tipo de medio, siempre que tengamos un convertidor de mensajes HTTP correspondiente que pueda manejarlo y enviarlo al flujo de salida.

4. Uso de productos para devolver imágenes

La devolución de matrices de bytes nos permite devolver casi cualquier cosa, como imágenes o archivos:

@GetMapping(value = "/image") public @ResponseBody byte[] getImage() throws IOException { InputStream in = getClass() .getResourceAsStream("/com/baeldung/produceimage/image.jpg"); return IOUtils.toByteArray(in); } 

Aquí, no estamos definiendo que la matriz de bytes devuelta sea una imagen. Por lo tanto, el cliente no podrá manejar esto como una imagen, y lo más probable es que el navegador simplemente muestre los bytes reales de la imagen.

Para definir que la matriz de bytes devuelta corresponde a una imagen, podemos establecer el atributo produce de la anotación @GetMapping para precisar el tipo MIME del objeto devuelto:

@GetMapping( value = "/get-image-with-media-type", produces = MediaType.IMAGE_JPEG_VALUE ) public @ResponseBody byte[] getImageWithMediaType() throws IOException { InputStream in = getClass() .getResourceAsStream("/com/baeldung/produceimage/image.jpg"); return IOUtils.toByteArray(in); } 

Aquí produce se establece en MediaType.IMAGE_JPEG_VALUE para indicar que el objeto devuelto debe manejarse como una imagen JPEG.

Y ahora, el navegador reconocerá y mostrará correctamente el cuerpo de la respuesta como una imagen.

5. Uso de productos para devolver datos sin procesar

El parámetro produce se puede establecer en muchos valores diferentes (la lista completa se puede encontrar aquí) dependiendo del tipo de objeto que queramos devolver.

Por lo tanto, si queremos devolver un archivo sin formato, simplemente podemos usar APPLICATION_OCTET_STREAM_VALUE :

@GetMapping( value = "/get-file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE ) public @ResponseBody byte[] getFile() throws IOException { InputStream in = getClass() .getResourceAsStream("/com/baeldung/produceimage/data.txt"); return IOUtils.toByteArray(in); } 

6. Conclusión

En este artículo rápido, analizamos un problema simple: devolver imágenes o archivos desde un controlador Spring.

Y, como siempre, el código de ejemplo se puede encontrar en Github.