Java前端图片保存到本地

服务接口


import org.springframework.web.multipart.MultipartFile;

/**
 * 文件服务
 *
 * @author Zhenfeng Li
 * @version 1.0
 * @date 2020-11-23 14:17
 */
public interface FileService {

    /**
     * 保存/更新图片
     *
     * @param multipartFile 图片
     * @param basePath      路径
     * @param id            主键Id
     * @param fileName      图片名称
     * @return 保存后的全路径
     * @throws Exception
     */
    String imgSaveOrUpdate(MultipartFile multipartFile, String basePath, Long id, String fileName) throws Exception;

    /**
     * 保存/更新图片
     *
     * @param byte64   图片base64
     * @param basePath 路径
     * @param id       主键Id
     * @param fileName 图片名称
     * @return 保存后的全路径
     * @throws Exception
     */
    String imgSaveOrUpdate(String byte64, String basePath, Long id, String fileName) throws Exception;

}

服务接口


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;

/**
 * 文件服务
 *
 * @author Zhenfeng Li
 * @version 1.0
 * @date 2020-11-23 14:25
 */
@Service
@Slf4j
public class FileServiceImpl implements FileService {
    /**
     * 图片存储绝对路径
     */
    @Value("${absolute.path}")
    private String absolutePath;

    /**
     * 图片服务器域名
     */
    @Value("${img.domain-name}")
    private String imgDomainName;

    @Override
    public String imgSaveOrUpdate(MultipartFile multipartFile,String basePath, Long id, String fileName) throws Exception {
        return saveOrUpdate(multipartFile, basePath, id, fileName);
    }

    @Override
    public String imgSaveOrUpdate(String byte64,String basePath, Long id, String fileName) throws Exception {
        return saveOrUpdate(byte64, basePath, id, fileName);
    }

    /**
     * @param multipartFile 图片文件
     * @param path          路径
     * @param id            用户/商户/商品/司机Id
     * @param fileName      文件存储名称
     * @return 文件保存后的url
     * @throws Exception 目录创建异常
     */
    private String saveOrUpdate(MultipartFile multipartFile, String path, Long id, String fileName) throws Exception {
        String suffix = Utils.getMultipartFileType(multipartFile);
        File file = makeDir(path, id, fileName, suffix);
        multipartFile.transferTo(file);
        return imgDomainName + "/" + path + "/" + id + "/" + fileName + "." + suffix;
    }

    /**
     * @param base64   图片base64
     * @param path     路径
     * @param id       用户/商户/商品/司机Id
     * @param fileName 文件存储名称
     * @return 文件保存后的url
     * @throws Exception 目录创建异常
     */
    private String saveOrUpdate(String base64, String path, Long id, String fileName) throws Exception {
        Base64Image base64Image = Base64Image.build(base64);
        byte[] bytes = base64Image.getBytes();
        String suffix = base64Image.getExtName();
        File file = makeDir(path, id, fileName, suffix);
        try (FileOutputStream writer = new FileOutputStream(file)) {
            writer.write(bytes);
        }
        return imgDomainName + "/" + path + "/" + id + "/" + fileName + "." + suffix;
    }

    /**
     * 创建目录
     *
     * @param path     文件路径
     * @param id       用户/商户/商品/司机Id
     * @param fileName 文件存储名称
     * @param suffix   文件后缀
     * @return 文件保存后的url
     * @throws Exception 目录创建异常
     */
    private File makeDir(String path, Long id, String fileName, String suffix) throws Exception {
        File file = new File(absolutePath + "/" + path + "/" + id + "/" + fileName + "." + suffix);
        if (!file.getParentFile().exists()) {
            if (!file.getParentFile().mkdirs()) {
                log.error("目录创建失败,[{}]", file.getPath());
                throw new Exception("目录创建失败");
            }
        }
        return file;
    }
}

工具类


import lombok.Data;

import java.util.Base64;

/**
 * Base64图片类
 *
 * @author Zhenfeng Li
 * @version 1.0
 * @date 2019-09-23 14:46
 */
@Data
public class Base64Image {
    /**
     * 图片数据
     */
    private byte[] bytes;

    /**
     * 图片后缀
     */
    private String extName;

    private Base64Image(byte[] bytes, String extName) {
        this.bytes = bytes;
        this.extName = extName;
    }

    public static Base64Image build(String base64) {
        byte[] bytes = base64ToByte(base64);
        String imgFormat = getImgFormat(base64);
        return new Base64Image(bytes, imgFormat);
    }

    /**
     * 图片base64获取图片格式
     */
    private static String getImgFormat(String base64) {
        String[] split = base64.split(",");
        if (split.length < 2) {
            return null;
        }
        if (split[0].toLowerCase().contains("/png")) {
            return "png";
        } else if (split[0].toLowerCase().contains("/jpeg")) {
            return "jpeg";
        } else if (split[0].toLowerCase().contains("/jpg")) {
            return "jpg";
        } else if (split[0].toLowerCase().contains("/gif")) {
            return "gif";
        } else if (split[0].toLowerCase().contains("/bmp")) {
            return "bmp";
        } else if (split[0].toLowerCase().contains("/tiff")) {
            return "tiff";
        }
        return null;
    }

    /**
     * 转换图片为byte
     *
     * @param base64 base64字符串
     * @return 返回byte[]
     */
    private static byte[] base64ToByte(String base64) {
        byte[] dataByte = Base64.getDecoder().decode(base64.split(",")[1].replace("\n", "").replace("\r", ""));
        for (int i = 0; i < dataByte.length; ++i) {
            //调整异常数据
            if (dataByte[i] < 0) {
                dataByte[i] += 256;
            }
        }
        return dataByte;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值