Estoy obteniendo datos de imagen (como byte[]
) de DB. ¿Cómo devolver esta imagen @ResponseBody
?
EDITAR
Lo hice sin @ResponseBody
usarHttpServletResponse
como parámetro de método:
@RequestMapping("/photo1")
public void photo(HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
IOUtils.copy(in, response.getOutputStream());
}
Usar @ResponseBody
con el org.springframework.http.converter.ByteArrayHttpMessageConverter
convertidor registrado como @Sid dijo que no funciona para mí :(.
@ResponseBody
@RequestMapping("/photo2")
public byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
fuente
Además de registrar un
ByteArrayHttpMessageConverter
, es posible que desee utilizar un enResponseEntity
lugar de@ResponseBody
. El siguiente código funciona para mí:fuente
Al usar Spring 3.1.xy 3.2.x, así es como debe hacerlo:
El método del controlador:
Y la anotación mvc en el archivo servlet-context.xml:
fuente
Además de algunas respuestas aquí, algunos consejos (Spring 4.1).
En caso de que no tenga ningún convertidor de mensajes configurado en su WebMvcConfig, tenerlo
ResponseEntity
dentro@ResponseBody
funciona bien.Si lo hace, es decir, tiene un
MappingJackson2HttpMessageConverter
configurado (como yo) utilizando lasResponseEntity
devoluciones aorg.springframework.http.converter.HttpMessageNotWritableException
.La única solución de trabajo en este caso es envolver un
byte[]
en el@ResponseBody
siguiente:En este caso, recuerde configurar los convertidores de mensajes correctamente (y agregue un
ByteArrayHttpMessageConverer
) en su WebMvcConfig, así:fuente
En el contexto de su aplicación, declare un AnnotationMethodHandlerAdapter y registerByteArrayHttpMessageConverter:
también en el método del controlador establezca el tipo de contenido apropiado para su respuesta.
fuente
Trabajó para mi.
fuente
Prefiero este:
Cambie el tipo de medio a cualquier formato de imagen que tenga.
fuente
ResourceLoader
, pero la construcción de una ruta de entrada externa como en el ejemplo es una mala idea: cwe.mitre.org/data/definitions/22.htmlEs trabajo para mí en la primavera 4.
fuente
Ninguna de las respuestas funcionó para mí, así que me las arreglé para hacerlo así:
Configurando el
Content-Disposition
encabezado pude descargar el archivo con la@ResponseBody
anotación en mi método.fuente
Debe especificar el tipo de medio en la respuesta. Estoy usando una anotación @GetMapping con produce = MediaType.IMAGE_JPEG_VALUE. @RequestMapping funcionará igual.
Sin un tipo de medio, es difícil adivinar lo que realmente se devuelve (incluye a cualquiera que lea el código, el navegador y, por supuesto, el propio Spring). Un byte [] simplemente no es específico. La única forma de determinar el tipo de medio a partir de un byte [] es husmear y adivinar.
Proporcionar un tipo de medio es la mejor práctica
fuente
Así es como lo hago con Spring Boot y Guava:
fuente
En la primavera 4 es muy fácil, no necesita hacer ningún cambio en los frijoles. Solo marque su tipo de devolución en @ResponseBody.
Ejemplo:-
fuente
Creo que quizás necesite un servicio para almacenar la carga de archivos y obtener ese archivo. Consulta más detalles desde aquí
1) Crear un servicio de almacenamiento
2) Crear controlador de descanso para cargar y obtener el archivo
}
fuente