最近写代码需要实现文件和文件夹的打包,然后就发现了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/
//这里只写一个简单的逻辑 @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(); } } }
希望对你有帮助