Browse Source

下载zip文件加密

wangliang 2 years ago
parent
commit
e121d84bd0

+ 0 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncDownloadPaperFileBatchService.java

@@ -45,7 +45,6 @@ public class AsyncDownloadPaperFileBatchService extends AsyncExportTaskTemplete
             TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
             Map<String, Object> result = taskLogicService.executeDownloadPaperFileBatch(map);
 
-            // ↓
             // 特殊的成功信息
             String specialSuccessMessage = String.valueOf(map.get("specialSuccessMessage"));
             if (SystemConstant.strNotNull(specialSuccessMessage)){

+ 6 - 19
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -1,7 +1,6 @@
 package com.qmth.distributed.print.business.templete.service.impl;
 
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.common.utils.BinaryUtil;
@@ -36,7 +35,6 @@ import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
 import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Cell;
@@ -658,7 +656,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
             jsonObject.put(SystemConstant.PATH, dirName);
         } else {
-            fileStoreUtil.copyInputStreamToFile(in,new File(stringJoiner.toString()),DigestUtils.md5Hex(new ByteArrayInputStream(outputStream.toByteArray())),LocalCatalogEnum.LOCAL_FILE);
+            fileStoreUtil.copyInputStreamToFile(in, new File(stringJoiner.toString()), DigestUtils.md5Hex(new ByteArrayInputStream(outputStream.toByteArray())), LocalCatalogEnum.LOCAL_FILE);
             jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
             jsonObject.put(SystemConstant.PATH, dirName);
         }
@@ -1105,7 +1103,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             count++;
         }
         zipLocalRootPath = zipLocalRootPath.replaceAll("\\\\", "/");
-        ZipUtil.zip(zipLocalRootPath, zipFile.getPath(), false);
+        Zip4jUtil.zipEncryptFile(zipFile.getPath(), zipLocalRootPath, SystemConstant.ZIP_ENCRYPT_PWD);
         JSONObject jsonObject = new JSONObject();
         if (oss) {//上传至oss
             fileStoreUtil.ossUpload(dirNameTmp, zipFile, BinaryUtil.toBase64String(HexUtils.decodeHex(DigestUtils.md5Hex(new FileInputStream(zipFile)))), fileStoreUtil.getUploadEnumByPath(dirNameTmp).getFssType());
@@ -1212,14 +1210,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         }
 
         File zipFile = new File(zipJoiner.toString() + dirNameTmp);
-        if (!zipFile.getParentFile().exists()) {
-            zipFile.getParentFile().mkdirs();
-        }
-        if (!zipFile.exists()) {
-            zipFile.createNewFile();
-        }
-
-        ZipUtil.zip(zipLocalRootPath, zipFile.getPath(), false);
+        Zip4jUtil.zipEncryptFile(zipFile.getPath(), zipLocalRootPath, SystemConstant.ZIP_ENCRYPT_PWD);
         JSONObject jsonObject = new JSONObject();
         if (oss) {//上传至oss
             fileStoreUtil.ossUpload(dirNameTmp, zipFile, BinaryUtil.toBase64String(HexUtils.decodeHex(DigestUtils.md5Hex(new FileInputStream(zipFile)))), fileStoreUtil.getUploadEnumByPath(dirNameTmp).getFssType());
@@ -1626,10 +1617,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         .add(String.format("%02d", nowTime.getDayOfMonth()))
                         .add(File.separator).add(SystemConstant.getUuid()).add(SystemConstant.ZIP_PREFIX);
                 zipFile = new File(stringJoiner.toString() + dirZipName.toString());
-                if (!zipFile.exists()) {
-                    zipFile.getParentFile().mkdirs();
-                    zipFile.createNewFile();
-                }
                 sourceFiles = new LinkedList<>();
                 List<TSyncExamStudentScore> updateTSyncExamStudentScoreList = new ArrayList<>();
                 errorTSyncExamStudentScoreList = new ArrayList<>();
@@ -1659,7 +1646,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 }
                 tSyncExamStudentScoreService.saveOrUpdateBatch(updateTSyncExamStudentScoreList);
                 if (Objects.nonNull(sourceFiles) && sourceFiles.size() > 0) {
-                    ZipUtil.zip(zipFile, false, sourceFiles.toArray(new File[sourceFiles.size()]));
+                    Zip4jUtil.zipEncryptFile(zipFile.getPath(), sourceFiles, SystemConstant.ZIP_ENCRYPT_PWD);
                     boolean oss = (boolean) map.get(SystemConstant.OSS);
                     JSONObject jsonObject = new JSONObject();
                     if (oss) {//上传至oss
@@ -1927,7 +1914,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             }
             count = count + courseCount;
         }
-        ZipUtil.zip(zipLocalRootPath, zipFile.getPath(), false);
+        Zip4jUtil.zipEncryptFile(zipFile.getPath(), zipLocalRootPath, SystemConstant.ZIP_ENCRYPT_PWD);
 
         boolean oss = dictionaryConfig.sysDomain().isOss();
         JSONObject jsonObject = new JSONObject();
@@ -1942,7 +1929,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         jsonObject.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.FILE);
         tbTask.setResultFilePath(jsonObject.toJSONString());
         ConvertUtil.delFolder(zipLocalRootPath);
-        if(oss) {
+        if (oss) {
             zipFile.delete();
         }
         map.put("count", count);

+ 11 - 5
pom.xml

@@ -50,6 +50,7 @@
         <junit.version>4.13</junit.version>
         <activiti.version>6.0.0</activiti.version>
         <activiti-modeler.version>5.22.0</activiti-modeler.version>
+        <zip4j.version>1.3.3</zip4j.version>
     </properties>
 
     <dependencyManagement>
@@ -154,11 +155,11 @@
                 <artifactId>springfox-swagger-ui</artifactId>
                 <version>${swagger2.version}</version>
             </dependency>
-<!--            <dependency>-->
-<!--                <groupId>com.github.xiaoymin</groupId>-->
-<!--                <artifactId>swagger-bootstrap-ui</artifactId>-->
-<!--                <version>${swagger2-bootstrap.version}</version>-->
-<!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.xiaoymin</groupId>-->
+            <!--                <artifactId>swagger-bootstrap-ui</artifactId>-->
+            <!--                <version>${swagger2-bootstrap.version}</version>-->
+            <!--            </dependency>-->
             <dependency>
                 <groupId>io.springfox</groupId>
                 <artifactId>springfox-swagger2</artifactId>
@@ -327,6 +328,11 @@
                 <artifactId>activiti-bpmn-layout</artifactId>
                 <version>${activiti.version}</version>
             </dependency>
+            <dependency>
+                <groupId>net.lingala.zip4j</groupId>
+                <artifactId>zip4j</artifactId>
+                <version>${zip4j.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 4 - 0
teachcloud-common/pom.xml

@@ -153,5 +153,9 @@
             <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
             <version>1.1.0</version>
         </dependency>
+        <dependency>
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -123,6 +123,7 @@ public class SystemConstant {
     public static final String ORG_SPLIT = "/";
     public static final String PUSH_OPERATE_NOTICE = "操作成功,请去基础配置 -> 系统设置 -> 同步管理中查看结果";
     public static final String EXCEL_PROTECT_KEY = "Qmth87863577";
+    public static final String ZIP_ENCRYPT_PWD = "qmthzip";
 
     /**
      * oss url过期时间

+ 2 - 11
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/AttachmentCommonServiceImpl.java

@@ -2,7 +2,6 @@ package com.qmth.teachcloud.common.service.impl;
 
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
-import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -10,8 +9,8 @@ import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.AttachmentCommonService;
-import com.qmth.teachcloud.common.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.util.FileStoreUtil;
+import com.qmth.teachcloud.common.util.Zip4jUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -83,16 +82,8 @@ public class AttachmentCommonServiceImpl implements AttachmentCommonService {
         File zipFile = null;
         try {
             zipName = StringUtils.isNotBlank(zipName) ? zipName : UUID.fastUUID() + ".zip";
-            if (!zipName.endsWith(".zip")) {
-                throw ExceptionResultEnum.ERROR.exception("压缩文件必须为zip");
-            }
             zipFile = FileUtil.file(filePath, zipName);
-            // 压缩文件
-            if (!zipFile.exists()) {
-                zipFile.createNewFile();
-            }
-            File[] srcFiles = files.toArray(new File[0]);
-            ZipUtil.zip(zipFile, true, srcFiles);
+            Zip4jUtil.zipEncryptFile(zipFile.getPath(), files, SystemConstant.ZIP_ENCRYPT_PWD);
             outputFile(response, zipFile, zipName);
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception("下载失败");

+ 2 - 19
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -2,7 +2,6 @@ package com.qmth.teachcloud.common.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.reflect.TypeToken;
@@ -643,20 +642,8 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         File zipFile = null;
         try {
             String zipPath = dictionaryConfig.fssLocalFileDomain().getConfig() + File.separator + schoolId;
-            File zipPathFile = new File(zipPath);
-            if (!zipPathFile.exists()) {
-                zipPathFile.mkdirs();
-            }
             zipFile = FileUtil.file(zipPath, time + ".zip");
-
-            // 压缩文件
-            if (!zipFile.exists()) {
-                zipFile.createNewFile();
-            }
-            File[] srcFiles = files.toArray(new File[files.size()]);
-//            ZipUtil.zip(rootFile.getAbsolutePath(), zipFile.getAbsolutePath(), false);
-
-            ZipUtil.zip(zipFile, true, srcFiles);
+            Zip4jUtil.zipEncryptFile(zipFile.getPath(), files, SystemConstant.ZIP_ENCRYPT_PWD);
             outputFile(response, zipFile, String.valueOf(time));
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception("下载失败");
@@ -678,11 +665,7 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         File zipFile = null;
         try {
             zipFile = FileUtil.file(dictionaryConfig.fssLocalFileDomain().getConfig(), time + ".zip");
-            // 压缩文件
-            if (!zipFile.exists()) {
-                zipFile.createNewFile();
-            }
-            ZipUtil.zip(rootPath, zipFile.getAbsolutePath(), true);
+            Zip4jUtil.zipEncryptFile(zipFile.getPath(), rootPath, SystemConstant.ZIP_ENCRYPT_PWD);
             outputFile(response, zipFile, String.valueOf(time));
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception("下载失败");

+ 240 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/Zip4jUtil.java

@@ -0,0 +1,240 @@
+package com.qmth.teachcloud.common.util;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import net.lingala.zip4j.core.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+import net.lingala.zip4j.model.ZipParameters;
+import net.lingala.zip4j.util.Zip4jConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import java.io.File;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @Description: zip4j工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/8/12
+ */
+public class Zip4jUtil {
+    private final static Logger log = LoggerFactory.getLogger(HttpKit.class);
+
+    /**
+     * 压缩zip
+     *
+     * @param scrPath
+     * @param files
+     */
+    public static void zipFile(String scrPath, List<File> files) {
+        try {
+            if (!scrPath.endsWith(".zip")) {
+                throw ExceptionResultEnum.ERROR.exception("压缩文件必须为zip");
+            }
+            if (CollectionUtils.isEmpty(files)) {
+                throw ExceptionResultEnum.ERROR.exception("没有待压缩的文件");
+            }
+            // 生成的压缩文件
+            ZipFile zipFile = new ZipFile(scrPath);
+            ZipParameters parameters = new ZipParameters();
+            // 压缩方式
+            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
+            // 压缩级别
+            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
+            // 要打包的文件夹
+            File[] fs = files.toArray(new File[0]);
+            // 遍历test文件夹下所有的文件、文件夹
+            for (File f : fs) {
+                if (f.isDirectory()) {
+                    zipFile.addFolder(f.getPath(), parameters);
+                } else {
+                    zipFile.addFile(f, parameters);
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    /**
+     * 压缩zip
+     *
+     * @param scrPath
+     * @param destPath
+     * @throws ZipException
+     */
+    public static void zipFile(String scrPath, String destPath) throws ZipException {
+        if (!scrPath.endsWith(".zip")) {
+            throw ExceptionResultEnum.ERROR.exception("压缩文件必须为zip");
+        }
+        try {
+            // 生成的压缩文件
+            ZipFile zipFile = new ZipFile(scrPath);
+            ZipParameters parameters = new ZipParameters();
+            // 压缩方式
+            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
+            // 压缩级别
+            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
+            // 要打包的文件夹
+            File currentFile = new File(destPath);
+            if (!currentFile.exists()) {
+                throw ExceptionResultEnum.ERROR.exception("待压缩的路径不存在");
+            }
+            File[] fs = currentFile.listFiles();
+            // 遍历test文件夹下所有的文件、文件夹
+            for (File f : fs) {
+                if (f.isDirectory()) {
+                    zipFile.addFolder(f.getPath(), parameters);
+                } else {
+                    zipFile.addFile(f, parameters);
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    /**
+     * 压缩zip带密码
+     *
+     * @param scrPath
+     * @param files
+     * @param password
+     * @throws ZipException
+     */
+    public static void zipEncryptFile(String scrPath, List<File> files, String password) throws ZipException {
+        if (!scrPath.endsWith(".zip")) {
+            throw ExceptionResultEnum.ERROR.exception("压缩文件必须为zip");
+        }
+        if (CollectionUtils.isEmpty(files)) {
+            throw ExceptionResultEnum.ERROR.exception("没有待压缩的文件");
+        }
+        try {
+            // 生成的压缩文件
+            ZipFile zipFile = new ZipFile(scrPath);
+            ZipParameters parameters = new ZipParameters();
+            // 压缩级别
+            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
+            // 压缩级别
+            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
+            parameters.setEncryptFiles(true);
+            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
+            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
+            Optional.ofNullable(password).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("压缩密码不能为空"));
+            parameters.setPassword(password);
+
+            // 要打包的文件夹
+            File[] fs = files.toArray(new File[0]);
+            // 遍历test文件夹下所有的文件、文件夹
+            for (File f : fs) {
+                if (f.isDirectory()) {
+                    zipFile.addFolder(f.getPath(), parameters);
+                } else {
+                    zipFile.addFile(f, parameters);
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    /**
+     * 压缩zip带密码
+     *
+     * @param scrPath
+     * @param destPath
+     * @param password
+     * @throws ZipException
+     */
+    public static void zipEncryptFile(String scrPath, String destPath, String password) throws ZipException {
+        if (!scrPath.endsWith(".zip")) {
+            throw ExceptionResultEnum.ERROR.exception("压缩文件必须为zip");
+        }
+        try {
+            // 生成的压缩文件
+            ZipFile zipFile = new ZipFile(scrPath);
+            ZipParameters parameters = new ZipParameters();
+            // 压缩级别
+            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
+            // 压缩级别
+            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
+            parameters.setEncryptFiles(true);
+            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
+            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
+            Optional.ofNullable(password).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("压缩密码不能为空"));
+            parameters.setPassword(password);
+
+            // 要打包的文件夹
+            File currentFile = new File(destPath);
+            if (!currentFile.exists()) {
+                throw ExceptionResultEnum.ERROR.exception("待压缩的路径不存在");
+            }
+            File[] fs = currentFile.listFiles();
+            // 遍历test文件夹下所有的文件、文件夹
+            for (File f : fs) {
+                if (f.isDirectory()) {
+                    zipFile.addFolder(f.getPath(), parameters);
+                } else {
+                    zipFile.addFile(f, parameters);
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    /**
+     * 解压zip
+     *
+     * @param scrPath
+     * @param destPath
+     */
+    public static void unzip(String scrPath, String destPath) {
+        try {
+            ZipFile zipFile = new ZipFile(scrPath);
+            zipFile.extractAll(destPath);
+        } catch (ZipException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    /**
+     * 解压zip带密码
+     *
+     * @param scrPath
+     * @param destPath
+     * @param password
+     */
+    public static void unzipEncryptFile(String scrPath, String destPath, String password) {
+        Optional.ofNullable(password).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("解压密码不能为空"));
+        try {
+            ZipFile zipFile = new ZipFile(scrPath);
+            if (zipFile.isEncrypted()) {
+                zipFile.setPassword(password);
+            }
+            zipFile.extractAll(destPath);
+        } catch (ZipException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+//    public static void main(String[] args) throws ZipException {
+//        List<File> fileList = Arrays.asList(new File("/Users/king/Downloads/pdf-temp/pdf/2022/08/12/2ecb7386e70940c585be4bbf062a3f51.pdf"),
+//                new File("/Users/king/Downloads/pdf-temp/pdf/2022/08/12/8f67b08558bb4841b0109d95efc7ea4a.pdf"));
+//        zipFile("/Users/king/Downloads/test1.zip", fileList);
+//        zipFile("/Users/king/Downloads/test2.zip", "/Users/king/Downloads/file-temp");
+//        zipEncryptFile("/Users/king/Downloads/test1.zip", "/Users/king/Downloads/pdf-temp", "123456");
+//        unzip("/Users/king/Downloads/test2.zip", "/Users/king/Downloads/test2");
+//        unzipEncryptFile("/Users/king/Downloads/test1.zip", "/Users/king/Downloads/test1", "123456");
+//    }
+}