springBoot如何使用@ResponseBoday返回图片

我们都知道使用HttpServletResponse可以通过输出流的方式来向前台输出图片。那么使用Spring Boot之后,我们应该如何来优雅的简化我们的代码呢?

首先,Spring Boot依然使用的是Spring MVC作为Controller层,那么通过Spring Boot的自动配置,可以很轻松的配置SpringMVC,这里我们使用Maven搭建Spring Boot项目,直接引入web依赖之后,自动配置即可。(使用Spring Boot 1.5.14版本)


 
 
  1. <dependency>
  2. <groupId>org.springframework.boot </groupId>
  3. <artifactId>spring-boot-starter-web </artifactId>
  4. </dependency>

然后,写一个Controller类,包括一个方法,如下:


 
 
  1. import org.springframework.http.MediaType;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. @Controller
  9. @RequestMapping(value = "/image")
  10. public class ImageController {
  11. @RequestMapping(value = "/get",produces = MediaType.IMAGE_JPEG_VALUE)
  12. @ResponseBody
  13. public byte[] getImage() throws IOException {
  14. File file = new File( "D:/test.jpg");
  15. FileInputStream inputStream = new FileInputStream(file);
  16. byte[] bytes = new byte[inputStream.available()];
  17. inputStream.read(bytes, 0, inputStream.available());
  18. return bytes;
  19. }
  20. }

解释一下,我们首先在@RequestMapping上加入produces告诉Spring,我们要返回的MediaType是一个图片(image/jpeg),然后加上@ResponseBody注解,方法返回byte[],然后将图片读进byte[]。如果不加produces会报错,有兴趣自己试。

前台测试一下,没有问题。但是有的人觉得,方法返回byte[]是不是不够优雅?没关系,SpringBoot的MVC还给我们提供了更优雅的方式,代码如下:


 
 
  1. import org.springframework.http.MediaType;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import javax.imageio.ImageIO;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.FileInputStream;
  9. import java.io.IOException;
  10. @Controller
  11. @RequestMapping(value = "/image")
  12. public class ImageController {
  13. @RequestMapping(value = "/get",produces = MediaType.IMAGE_JPEG_VALUE)
  14. @ResponseBody
  15. public BufferedImage getImage() throws IOException {
  16. return ImageIO.read( new FileInputStream( new File( "D:/test.jpg")));
  17. }
  18. }

 怎么样,一行代码就解决了问题,是不是更优雅?其他人看到你的代码,也一眼就知道你是返回的一张图片。

这里稍做解释,我们使用JAVA 自带的ImageIO来读取图片,返回一个BufferedImage对象,同样使用produces来告诉Spring我要返回一个图片。

如果感兴趣,想知道其中的实现原理,其实很简单,加了@ResponseBody注解之后,SpringMVC 不再去找视图,而是通过

HttpMessageConverter这个接口的实现类而进行消息转化,当你的方法返回了byte[] 的时候,Spring则判断使用ByteArrayHttpMessageConverter来做消息转化,返回到前台,同样,我们返回Json和xml的时候,也是使用的(如果没有自定义配置)spring自带的MappingJackson2HttpMessageConverter来做消息转化。同理,Spring还提供了BufferedImageHttpMessageConverter这个实现,所以我们才能够通过返回BufferedImage来直接返回图片。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值