java—图片文件zip解压并转base64

该博客主要介绍如何在不将图片保存到服务器的情况下,通过Java实现从zip文件中解压图片并将其转换为Base64编码。提供了一个`UnzipUtils`工具类,包括`unzip`方法用于本地文件解压和`unzip`方法用于处理上传的MultipartFile对象。此外,还包含一个`MultipartFileToFileUtil`工具类,用于将MultipartFile转换为File对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要是为了解决图片文件zip解压并转base64,图片以base64编码保存,不以文件形式保存至服务器的场景。

1、文件解析后对象

/**
 * 文件解析对象
 */
@Data
public class UnzipFileVo {
    /**
     * 文件类型:(0:文件夹;1:图片)
     */
    private Integer type;
    /**
     * 文件路径(如:src/main/java/com/zyq/entity/User.java)
     */
    private String path;
    /**
     * 图片名称
     */
    private String name;
    /**
     * 图片base64
     */
    private String imgBase64;
}

2、解压文件工具类

/**
 * 解析文件工具类
 */
public class UnzipUtils {

    /**
     * 本地文件解压
     *
     * @param file 压缩后的zip图片文件
     * @return 解压后的图片信息列表
     */
    public static List<UnzipFileVo> unzip(File file) {
        if (Objects.isNull(file) || !file.exists()) {
            return Collections.emptyList();
        }
        ZipFile zip = null;
        try {
            zip = new ZipFile(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (Objects.isNull(zip)) {
            return Collections.emptyList();
        }
        Enumeration<? extends ZipEntry> entries = zip.entries();
        List<UnzipFileVo> vos = new ArrayList<>();
        while (entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();
            String path = entry.getName();
            UnzipFileVo vo = new UnzipFileVo();
            vo.setPath(path);
            // 解析文件夹
            boolean directory = entry.isDirectory();
            if (directory) {
                //为空的文件夹,不做处理
                continue;
            }
            byte[] bytes = null;
            try {
                InputStream in = zip.getInputStream(entry);
                bytes = read(in); //解决图片显示不全问题
            } catch (IOException e) {
                e.printStackTrace();
            }
            BASE64Encoder encoder = new BASE64Encoder();
            String base64Str = encoder.encode(bytes); //bytes转base64
            String name = path.substring(path.lastIndexOf("/") + 1).split("\\.")[0];
            vo.setType(1);
            vo.setName(name);
            vo.setImgBase64("data:image/png;base64," + base64Str);
            vos.add(vo);
        }
        if (Objects.nonNull(zip)) {
            try {
                zip.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return vos;
    }


    /**
     * 处理图片显示不全问题
     *
     * @param inputStream 上传文件流
     * @return 字节
     */
    public static byte[] read(InputStream inputStream) throws IOException {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int num = inputStream.read(buffer);
            while (num != -1) {
                baos.write(buffer, 0, num);
                num = inputStream.read(buffer);
            }
            baos.flush();
            return baos.toByteArray();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }


    /**
     * 上传文件解压
     *
     * @param multipartFile 上传文件
     * @return 解压后的文件列表
     */
    public static List<UnzipFileVo> unzip(MultipartFile multipartFile) {
        File file = MultipartFileToFileUtil.transferToFile(multipartFile);
        if (Objects.isNull(file)) {
            return Collections.emptyList();
        }
        List<UnzipFileVo> vos = unzip(file);
        if (file.exists()) {
            file.delete();
        }
        return vos;
    }

}
public class MultipartFileToFileUtil {
    /**
     * MultipartFile 转 File
     *
     * @param multipartFile
     * @throws Exception
     */
    public static File transferToFile(MultipartFile multipartFile) {
        //选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            //获取文件后缀
            String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));
            file = File.createTempFile(originalFilename, prefix);
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值