JFinal使用技巧-Base64图片码转为图片流输出

RT,遇到一个需求,base64图片码存数据库的,然后需要显示为图片,(浏览器可以展示base64图片码),这边非浏览器端。
总之接口那边需要的是图片,不是码。

废话不多说,直接上码:
建一个 Base64ImgRender.java

import com.jfinal.render.Render;
import com.jfinal.render.RenderException;

import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.util.Base64;

/**
 * base64 图片码 转 图片流
 */
public class Base64ImgRender extends Render {

    private String base64Img;

    public Base64ImgRender(String base64Img) {
        this.base64Img = base64Img;
    }

    public void render() {
        response.setHeader("Pragma","no-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/png");

        try {
            Base64.Decoder decoder = Base64.getDecoder();
            // 去掉base64前缀 data:image/jpeg;base64,
            base64Img = base64Img.substring(base64Img.indexOf(",", 1) + 1);
            byte[] b = decoder.decode(base64Img);
            // 处理数据
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            ServletOutputStream outputStream = response.getOutputStream();
            outputStream.write(b);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            throw new RenderException(e);
        }
    }
}


Controller 中使用:

String avatar = x.getStr("avatar");
render(new Base64ImgRender(avatar));

搞定~

祝大家端午快乐~

评论区

jfinal爱好者22

2022-06-06 16:22

存一个url链接不香吗?

杜福忠

2022-06-06 17:14

@jfinal爱好者22 香啊,需求场景不同罢了。比如不需要常查看的交易截图、集群环境无图床服务时等等需求。这边客户要求放数据库的(我们推荐放阿里云oss的),需求如此,JFinal扩展起来依旧优雅~

j1066783215

2022-06-06 17:44

31行的处理数据 没看懂

杜福忠

2022-06-06 19:17

@j1066783215 说是byte是有符号的,它表示的范围是-127~127,如果要映射到无符号0~255,那么0~127不用改变,而-128~-1对应128~255,所以+= 256给反过来。具体可以认为就是一种图片还原的算法处理,不补位图片不能还原。
网上很多资料的 https://blog.csdn.net/weixin_36258891/article/details/114617965