前言
最近写代码需要实现文件和文件夹的打包,然后就发现了zip4j,个人用下来感觉zip4j很好用,再加上发现了个坑,在网上找了半天,发现一堆重复的文章,加上也没人说明这个坑,所以自己写篇文章,做个笔记,如有错误还请指正。
压缩文件或文件夹
首先引入依赖
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
压缩文件(有坑)
//filePath是你要打包文件夹的路径
public static String creatZipFile(List<String> filePath){
//生成压缩包路径,ZIPPATH是压缩包路径
File zipPath = new File(ZIPPATH);
if (!zipPath.exists()) {
zipPath.mkdir();
}
// 生成的压缩文件,xxx.zip是你生成的压缩文件
ZipFile zipFile = null;
try {
zipFile = new ZipFile(ZIPPATH + "\\xxx.zip");
ZipParameters parameters = new ZipParameters();
// 压缩方式
//COMP_STORE = 0; 仅打包,不压缩
//COMP_DEFLATE = 8; 默认
//COMP_AES_ENC = 99; 加密压缩
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别
//DEFLATE_LEVEL_FASTEST = 1; 速度最快,压缩比最小
//DEFLATE_LEVEL_FAST = 3; 速度快,压缩比小
//DEFLATE_LEVEL_NORMAL = 5; 一般
//DEFLATE_LEVEL_MAXIMUM = 7;
//DEFLATE_LEVEL_ULTRA = 9;
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
// 要打包的文件夹
for (String path : filePath) {
File currentFile = new File(path);
zipFile.addFolder(currentFile.getPath(), parameters);
}
//如果只是打包文件可以用下面这个方法,file是你的文件路径
//zipFile.addFile(file, parameters);
} catch (ZipException e) {
e.printStackTrace();
return "压缩失败";
}
return "压缩成功";
}
坑:要打包多个文件夹一定要用addFolder(),如果用addFile()在添加其他文件夹下的文件时会失败
zip4j还支持加密、解密压缩,文件的删除等,其他功能读者可以自行尝试
附上zip4j官网:http://www.lingala.net/zip4j/
Springboot将压缩包传给前端
控制层
//这里只写一个简单的逻辑
@PostMapping("/download/zip")
public String packagerPhoto(HttpServletResponse response){
response.setContentType("application/zip");
response.setCharacterEncoding("utf-8");
//xxx.zip是你压缩包文件名
response.setHeader("Content-Disposition", "attachment;filename=xxx.zip");
//你压缩包路径
String path = "xxx//xxx//xxx.zip";
ZipUtils.downloadZip(response, path);
return "下载成功";
}
工具类
public class ZipUtils {
public static void downloadZip(HttpServletResponse response, String path){
File file = new File(path);
try {
ZipFile zipFile = new ZipFile(file);
InputStream fis = new FileInputStream(zipFile.getFile());
IOUtils.copy(fis, response.getOutputStream());
fis.close();
}catch (Exception e){
e.printStackTrace();
}
if (file.exists()) {
file.delete();
}
}
}
希望对你有帮助