SpringBoot如何优雅的使用@ResponseBody返回图片

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

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>  
</dependency>

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

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@Controller
@RequestMapping(value = "/image")
public class ImageController {
    @RequestMapping(value = "/get",produces = MediaType.IMAGE_JPEG_VALUE)
    @ResponseBody
    public byte[] getImage() throws IOException {
        File file = new File("D:/test.jpg");
        FileInputStream inputStream = new FileInputStream(file);
        byte[] bytes = new byte[inputStream.available()];
        inputStream.read(bytes, 0, inputStream.available());
        return bytes;
    }
}

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

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

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@Controller
@RequestMapping(value = "/image")
public class ImageController {
    @RequestMapping(value = "/get",produces = MediaType.IMAGE_JPEG_VALUE)
    @ResponseBody
    public BufferedImage getImage() throws IOException {
        return ImageIO.read(new FileInputStream(new File("D:/test.jpg")));
    }
}

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

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

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

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

猜你喜欢

转载自blog.csdn.net/u014449560/article/details/82807517