Java Base64上传图片并存入指定目录

1 篇文章 0 订阅
1 篇文章 0 订阅

技术概述

在编写spring boot后端项目时,后端需要接收前端转换完毕的base64图片,并且将图片存入到指定目录上。这一技术难点就在于在如何将base64转换成图片并存入指定目录路径。

代码内容

1、controller文件内容  接收传入的base64

    @PostMapping("/base64Imager")
    @ApiOperation(notes = "base64Imager",value = "base64上传图片")
    public RestResponse<String> base64Imager(String base64Imager){
        String fileImager = toolService.base64ToImage(base64Imager);
        return RestResponse.ok(fileImager);
    }

2、service文件内容 将base64转换为 MultipartFile类型并上传至目录

    /**
     * 将base64图片转换成图片并存入指定目录中
     * @param base64Imager
     * @return
     */
    public String base64ToImage(String base64Imager){
        //定义上传图片保存路径
        String  path = "图片想要保存的路径";
        //将base64 转换成 MultipartFile 
        MultipartFile file = 
        BASE64DecodedMultipartFileUtil.base64ToMultipart(base64Imager);
        //图片名称
        String fileName = file.getOriginalFilename();
        //获取图片的后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //生成新的图片名称
        String newImgName = UUID.randomUUID().toString()+suffixName;
        File filepath = new File(path,newImgName);
        // 判断路径是否存在,如果不存在就创建一个
        if (!filepath.getParentFile().exists()) {
            filepath.getParentFile().mkdirs();
        }
        try {
            // 写入文件
            file.transferTo(new File(path + File.separator + newImgName));
            log.info("文件上传成功,上传路径为: "+path+newImgName);
            return path+newImgName;
        } catch (IOException e) {
            e.printStackTrace();
            log.info("文件上传失败");
            return null;
        }
        
    }

3、BASE64DecodedMultipartFileUtil 工具内容 用于转换 base64


import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.Base64;
import java.util.Base64.Decoder;
public class BASE64DecodedMultipartFileUtil implements MultipartFile {
    private final byte[] imgContent;
    private final String header;

    public BASE64DecodedMultipartFileUtil(byte[] imgContent, String header) {
        this.imgContent = imgContent;
        this.header = header.split(";")[0];
    }

    @Override
    public String getName() {
        // TODO - implementation depends on your requirements
        return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
    }

    @Override
    public String getOriginalFilename() {
        // TODO - implementation depends on your requirements
        return System.currentTimeMillis() + (int)Math.random() * 10000 + "." + header.split("/")[1];
    }

    @Override
    public String getContentType() {
        // TODO - implementation depends on your requirements
        return header.split(":")[1];
    }

    @Override
    public boolean isEmpty() {
        return imgContent == null || imgContent.length == 0;
    }

    @Override
    public long getSize() {
        return imgContent.length;
    }

    @Override
    public byte[] getBytes() throws IOException {
        return imgContent;
    }

    @Override
    public InputStream getInputStream() throws IOException {
        return new ByteArrayInputStream(imgContent);
    }

    @Override
    public void transferTo(File dest) throws IOException, IllegalStateException {
        new FileOutputStream(dest).write(imgContent);
    }


    public static MultipartFile base64ToMultipart(String base64) {
        try {
            String[] baseStrs = base64.split(",");
            // /lib/tool.jar和/lib/rt.jar已经从JDK9中删除
            // 如果你不是JDK 9及以上的版本 可以使用
            // BASE64Decoder decoder = new BASE64Decoder();
            Decoder decoder = Base64.getDecoder();
            byte[]  b = decoder.decode(baseStrs[1]);
            for(int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            return new BASE64DecodedMultipartFileUtil(b, baseStrs[0]);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
}

经过以上步骤,我们就可以向指定目录中上传一张图片了。

技术使用过程中遇到的问题以及解决过程

上传图片到服务器过程中,由于服务器是Linux系统,与我们平时使用的Windows系统不同,Linux文件路径与Windows有较大的差异,文件名与文件路径之间要用"/"来隔开,而不是Windows中的"\"。这一点要注意,否则服务器上的文件就无法索引到。

技术总结

上传图片虽然步骤没有多么复杂,但是还是要注意一些小细节,以免在出现错误的时候,不好查找,最近一直在整理开发中会遇到使用的工具类,发现对于java 的基础认知还是不够全面,需要多多学习。

最后本人是个小萌新,请大佬们多多指教!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值