package com.terra.system.helper; import com.terra.common.helper.StringHelper; import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.model.enums.AesKeyStrength; import net.lingala.zip4j.model.enums.CompressionLevel; import net.lingala.zip4j.model.enums.CompressionMethod; import net.lingala.zip4j.model.enums.EncryptionMethod; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.File; import java.nio.charset.StandardCharsets; /** * Zip4j帮助类 * @author WWW */ public class Zip4jHelper { private final static Log log = LogFactory.getLog(Zip4jHelper.class); /** * Zip压缩 * * @param zipFile zip文件 * @param sourcePath 源路径 * @param pwd 密码 * @return 成功是否 */ public static boolean zip(String zipFile, String sourcePath, String pwd) { try { ZipFile zip = StringHelper.isEmpty(pwd) ? new ZipFile(zipFile) : new ZipFile(zipFile, pwd.toCharArray()); zip.setCharset(StandardCharsets.UTF_8); File f = zip.getFile(); if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } if (f.exists()) { f.delete(); } ZipParameters params = getZipParams(!StringHelper.isEmpty(pwd)); // 要打包的文件或文件夹 File currentFile = new File(sourcePath); if (currentFile.isDirectory()) { zip.addFolder(currentFile, params); } else { zip.addFile(currentFile, params); } return true; } catch (Exception ex) { log.error(ex.getMessage(), ex); return false; } } /** * 创建ZipFile */ public static ZipFile createZipFile(String zipFile, String pwd) { try { ZipFile zip = StringHelper.isEmpty(pwd) ? new ZipFile(zipFile) : new ZipFile(zipFile, pwd.toCharArray()); // zip.setCharset(Charset.forName("GBK")) zip.setCharset(StandardCharsets.UTF_8); File f = zip.getFile(); if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } if (f.exists()) { f.delete(); } return zip; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * 获取ZipParameters */ public static ZipParameters getZipParams(boolean hasPwd) { // 设置压缩文件参数 ZipParameters params = new ZipParameters(); // 压缩方式 params.setCompressionMethod(CompressionMethod.DEFLATE); // 压缩级别 params.setCompressionLevel(CompressionLevel.MAXIMUM); if (hasPwd) { // 是否设置加密文件 params.setEncryptFiles(true); // 设置AES加密强度:KEY_STRENGTH_256 params.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_128); // 设置加密算法 params.setEncryptionMethod(EncryptionMethod.AES); } return params; } /** * 添加文件至压缩包 * * @param zip ZipFile * @param params ZipParameters * @param file File * @throws ZipException */ private static void addZipFile(ZipFile zip, ZipParameters params, File file) throws ZipException { if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { addZipFile(zip, params, f); } } else { zip.addFile(file, params); } } /** * Zip解压 * * @param zipFile zip文件 * @param toPath 解压路径 * @param password 密码 * @return 成功是/否 */ public static boolean unzip(String zipFile, String toPath, String password) { try { // 生成的压缩文件 ZipFile zip = new ZipFile(zipFile); // 设置密码 if (!StringHelper.isEmpty(password)) { zip.setPassword(password.toCharArray()); } // 解压缩所有文件以及文件夹 zip.extractAll(toPath); return true; } catch (Exception ex) { log.error(ex.getMessage(), ex); return false; } } }