前言
无论是返回图片还是返回任何数据,本质都是对HTTP协议的使用,无论是使用Servlet API,还是Spring提供的API,都是对底层操作的封装。只有了解了HTTP协议,才不会被各种API所迷惑。
版本:Spring Boot 1.5x
使用Servlet API
最简单的,直接使用servlet的相关接口:
response.addHeader("Content-Type","image/jepg");
OutputStream out = response.getOutputStream();
ImageIO.write(image,"JPEG",out);
out.flush();
out.close();
使用MVC API
返回图片最合理的方式是使用@ResponseBody,其中BufferedImage是Java中表示图片的类。
@RequestMapping(...)
@ResponseBody
public BufferedImage verifyCode(){
//...
return image;
}
Spring MVC通过消息转换机制将返回数据转换为字节流。Spring MVC预定义了BufferedImage的转换器,但Spring Boot默认并没有加载该组件。
因此需要在配置类中手动添加:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
//...
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(bufferedImageHttpMessageConverter());
}
@Bean
public BufferedImageHttpMessageConverter bufferedImageHttpMessageConverter(){
return new BufferedImageHttpMessageConverter();
}
}
设置返回类型
但框架还无法确定返回图片的具体类型,会抛出错误:
Only integral single-band bilevel image is supported.
需要设置返回的图片类型:
@RequestMapping(//...,produces = {MediaType.IMAGE_JPEG_VALUE})