Spring MVC 返回图片内容

前言

无论是返回图片还是返回任何数据,本质都是对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})

猜你喜欢

转载自www.cnblogs.com/redreampt/p/10754918.html