【Java实战】Java 实现 Base64 文件批量压缩为 ZIP

【Java实战】Java 实现 Base64 文件批量压缩为 ZIP 一、前言在实际项目开发中经常遇到这样的场景前端上传多个文件后以 Base64 格式存储或者从数据库读取多个 Base64 编码的文件需要将这些文件打包成 ZIP 压缩包供用户下载。本文分享一个实用的 Java ZIP 压缩工具类二、应用场景批量导出附件合同、发票、图片等报表文件打包下载多张图片压缩传输文档归档功能三、关键步骤解析Base64 解码使用 Hutool 的 Base64.decode() 将字符串转为字节数组创建 ZIP 条目new ZipEntry(fileName) 定义压缩包内的文件名写入数据通过 zipOutputStream.write() 写入文件内容关闭条目closeEntry() 结束当前文件的写入四、核心代码import cn.hutool.core.codec.Base64; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * Description: Zip 工具类 * Author: WangYuHuang * Date: 2026-3-30 * Version: V1.0 */ Slf4j public class ZipUtil { Data public static class FileData { // 文件编号 private String code; // 文件名称 private String fileName; // 文件后缀 private String suffix; // Base64文件内容 private String base64File; } /** * 将Base64编码的文件列表压缩为ZIP格式 * * param zipOutputStream ZIP输出流 * param list 待压缩的文件数据列表 */ public static void downloadZipFromBase64(ZipOutputStream zipOutputStream, ListFileData list) { if (zipOutputStream null || list null || list.isEmpty()) { log.warn(Zip输出流或文件列表为空); return; } for (FileData file : list) { if (file null) { log.warn(跳过空文件对象); continue; } try { String fileName file.getFileName() . file.getSuffix(); String base64Content file.getBase64File(); if (base64Content null || base64Content.isEmpty()) { log.warn(文件内容为空跳过{}, fileName); continue; } if (fileName null || fileName.isEmpty()) { log.warn(文件名为空跳过); continue; } // 解码Base64为字节数组 byte[] fileBytes Base64.decode(base64Content); // 创建ZIP条目 ZipEntry zipEntry new ZipEntry(fileName); zipOutputStream.putNextEntry(zipEntry); // 写入文件数据 zipOutputStream.write(fileBytes); // 关闭当前条目 zipOutputStream.closeEntry(); log.debug(成功添加文件到ZIP{}, fileName); } catch (Exception e) { log.error(处理文件失败{}错误{}, file.getFileName(), e.getMessage(), e); } } } }五、注意事项1.Base64 前缀处理:如果 Base64 包含前缀如 data:image/png;base64,xxx需要先去除String base64Content file.getBase64File(); if (base64Content.contains(,)) { base64Content base64Content.substring(base64Content.indexOf(,) 1); }2.大文件内存溢出Base64 解码后会占用 3/4 的原始大小大量大文件可能导致 OOM。建议限制单次压缩的文件数量和总大小使用临时文件而非全部加载到内存3.文件名重复问题如果多个文件同名后面的会覆盖前面的。建议添加唯一标识String fileName file.getCode() _ file.getFileName() . file.getSuffix();六、总结✅ 简洁易用只需传入文件列表和输出流✅ 健壮性强完善的空值校验和异常处理✅ 日志完善便于问题排查✅ 灵活扩展可适配各种业务场景希望这篇分享对大家有帮助如果觉得有用欢迎点赞收藏