Loading...
墨滴

季布编程

2021/06/11  阅读:44  主题:默认主题

用Java在服务端发布一张图片的方法

用Java在服务端发布一张图片的方法


1、问题

  最近遇到这样一个需求,产品经理给一张图片,希望通过点击一条链接,在页面看到这张图片。

  做成之后的效果,类似于下面的连接,它其实链到了一张图片,它的连接是https://img2.baidu.com/it/u=2637199347,3038621730&fm=26&fmt=auto&gp=0.jpg,点击个连接,就可以看到这条连接对应的图片。

图1 链接到一张图片的链接
图1 链接到一张图片的链接

  面对这个需求,最容易想到的实现方法是让前端在前端项目中将这张图片放在一个目录,然后直接给出连接地址就好了。可是,前端说不会做,真是无语了,连这都不会。最后为了尽快实现这个需求,只好后端来做了。

2、实现方法

  本文要简述一下,后端发布一张图片的过程。

  首先,要自己新建一个基于Maven的SpringBoot项目,或者,就找一个现有的SpringBoot项目。

  其次,将要显示的图片放入src/main/resources/目录下。

  第三,在src/main/java下新建一个Controller。然后,写入如下的代码。看下面的代码,知道实现原理就可以了,具体在自己的项目中灵活实现。

package com.cicv.historytrail.controller;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.BufferedInputStream;
import java.io.InputStream;

@RestController
public class PubImageController {
    @GetMapping(value = "/pubImage", produces = MediaType.IMAGE_JPEG_VALUE)
    public byte[] pubImage() throws Exception {
        //这里加载的是resource目录下的图片,也就是说要将图片放入resource目录下
        InputStream inputStream =  this.getClass().getResourceAsStream("/index.jpg");
        
        //这里用BufferedInputStream包装InputStream是为了防止图片过大,打开连接后,图片显示不完整
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

        byte[] bytes = new byte[bufferedInputStream.available()];
        bufferedInputStream.read(bytes, 0, bufferedInputStream.available());

        return bytes;
    }
}

  项目运行后,从浏览器中访问接口地址,可以看到如下效果:

图2 项目运行后的效果
图2 项目运行后的效果

3、注意点

  这个实现比较简单,需要注意的关键点有两个。

  第一个关键点,GetMapping里要有produces = MediaType.IMAGE_JPEG_VALUE这一句。有了这一句,http返回给浏览器的response header中会有Content-Type: image/jpeg,这个header会告诉浏览器将接收到的字节数组当成一幅图片来显示。

  第二个关键点,程序中用InputStream加载了图片之后,还要用BufferedInputStream对InputStream包装一层,否则在浏览器中会看到图片显示不完整,只显示了一部分,或者就干脆不显示图片,有了这个包装以后,就可以顺利的看到完整的图片了。

  这一个注意点是我实践中碰到的特殊情况,需要特别说明。因为网上其他的教程没有这个包装过程,我最开始也是参考了网上的教程,但是遇到这个问题,琢磨的了好久才想到解决办法。

4、原理

  这样做完之后,需求是解决了,可是这么做得原理是什么呢?为什么可以这么做呢?这个值得探究一下,能够加深对http的理解。

  留待有兴趣的时候,再说吧,先下班了。

季布编程

2021/06/11  阅读:44  主题:默认主题

作者介绍

季布编程

欢迎关注同名公众号"季布编程"