Spring MVC:如何在@ResponseBody中返回图像?
我正在从数据库获取图像数据(如byte[]
)。如何在@ResponseBody
中返回此图像
编辑
我使用HttpServletResponse
作为方法参数,在没有@ResponseBody
的情况下完成了这项工作:
@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());
}
将@ResponseBody
与注册的org.springframework.http.converter.ByteArrayHttpMessageConverter
转换器一起作为@Sid使用对我来说不起作用:(
@ResponseBody
@RequestMapping("/photo2")
public byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
# 1 楼答案
我更喜欢这个:
将媒体类型更改为现有的图像格式
# 2 楼答案
除了这里的几个答案之外,还有一些建议(Spring 4.1)
如果您的WebMvcConfig中没有配置任何messageconverters,那么在
@ResponseBody
中配置ResponseEntity
效果很好如果你这样做了,也就是说,你有一个
MappingJackson2HttpMessageConverter
配置(像我一样),使用ResponseEntity
返回一个org.springframework.http.converter.HttpMessageNotWritableException
在这种情况下,唯一有效的解决方案是将
byte[]
包装在@ResponseBody
中,如下所示:在这种情况下,请记住在WebMvcConfig中正确配置messageconverters(并添加
ByteArrayHttpMessageConverer
),如下所示:# 3 楼答案
使用Spring 4.1及以上版本,您可以非常简单地返回几乎任何内容(如图片、PDF、文档、罐子、拉链等),而无需任何额外的依赖项。例如,以下方法可以从MongoDB GridFS返回用户的个人资料图片:
需要注意的是:
以InputStreamResource作为返回类型的响应性
ResponseEntity builder风格创建
使用这种方法,您不必担心HttpServletResponse中的自动连接、引发IOException或复制流数据
# 4 楼答案
除了注册
ByteArrayHttpMessageConverter
之外,您可能还希望使用ResponseEntity
而不是@ResponseBody
。以下代码适用于我:# 5 楼答案
通过使用Spring 3.1。x和3.2。x、 你应该这样做:
控制器方法:
以及servlet上下文中的mvc注释。xml文件:
# 6 楼答案
如果您使用的是Spring版本的3.1或更新版本,那么可以在
@RequestMapping
注释中指定“products”。下面的例子对我来说是现成的。如果启用了web mvc(@EnableWebMvc
),则不需要寄存器转换器或其他任何东西