base64图片转本地文件

原文链接:https://www.jylt.cc/#/detail?id=dda55435cfa02dfbfc91729e3d3daf08

背景

日常我们在保存图片的时候,会将图片放到服务器本地或者上传到其他服务器,然后将图片的路径放入到数据库,这样既可以减小数据库占用空间,又可以减轻数据库的操作压力。

但富文本编辑器有时候会被粘贴进来base64的图片,如果直接将这种类型的数据入库会使数据库占用空间急剧增长,很不合理。这时候我们理想的状态就是将base64图片转成图片文件存储起来,将base64地址替换为文件的实际地址。

base64转本地文件方法


/**
 * base64图片转为本地文件
 *
 * @param baseStr base64图片地址
 * @return 图片文件
 */
private static File base64ToFile (String baseStr) {
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            Base64ImgInfo base64ImgInfo = getBase64ImgInfo(baseStr);
            if (base64ImgInfo == null) {
                return null;
            }
            byte[] b = decoder.decodeBuffer(base64ImgInfo.getImgStr());
            // 处理数据
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            return File.createTempFile(UUID.randomUUID().toString(), base64ImgInfo.getType());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 获取base64图片信息
     *
     * @param baseStr base64字符串
     * @return base64图片信息
     */
    private static Base64ImgInfo getBase64ImgInfo(String baseStr) {
        //允许的图片格式(可配置)
        String imgType = "jpg,png,jpeg,gif";
        if (!StringUtils.isEmpty(imgType)) {
            String[] imgTypes = imgType.split(",");
            Pattern pattern;
            Matcher matcher;
            String regex;
            for (String v : imgTypes) {
                regex = MessageFormat.format("data:image/{0};base64,", v);
                pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
                matcher = pattern.matcher(baseStr);
                if (matcher.lookingAt()) {
                    Base64ImgInfo base64ImgInfo = new Base64ImgInfo();
                    base64ImgInfo.setImgStr(matcher.replaceFirst(""));
                    base64ImgInfo.setType("." + v);
                    return base64ImgInfo;
                }
            }
        }
        return null;
    }

    @Data
    public static class Base64ImgInfo {
        /**
         * 图片格式,比如.png
         */
        private String type;

        /**
         * base64正文部分,去除前面data:image/png;base64,标识
         */
        private String imgStr;
    }

这样,通过调用方法base64ToFile 就可以获取到base64转换的图片文件了。

https://data-water.oss-cn-beijing.aliyuncs.com/%E5%85%AC%E4%BC%97%E5%8F%B7%E7%B4%A0%E6%9D%90/%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E7%99%BD%E8%89%B2%E7%89%88.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值