Zip4J 使用

今天接触到一个要解压上传的加密zip的需求,这里使用 zip4j 来实现加密解密。

依赖

<dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.9.0</version>
</dependency>

加密

/*** 添加普通文件为zip文件** @param srcPath  普通文件路径 E:\\test_zip_file\\image.png* @param destPath 要生成的zip文件路径 E:\\test_zip_file\\image.zip* @param password 加密密钥,为空时不加密 123456* @throws ZipException zip异常*/
public static void zip(String srcPath, String destPath, String password) throws ZipException {File srcFile = new File(srcPath);//创建目标文件ZipFile zipfile = new ZipFile(destPath);ZipParameters param = new ZipParameters();if (StringUtils.isNotBlank(password)) {zipfile.setPassword(password.toCharArray());param.setEncryptFiles(true);param.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);}zipfile.addFile(srcFile, param);
}

zipfile.setPassword(char[]):设置压缩文件的密码;

param.setEncryptFiles(true);
param.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);

设置加密和加密的算法,还可以选择 EncryptionMethod 中的其他枚举

参考:https://github.com/srikanth-lingala/zip4j

解压(解密)

/*** 解压加密zip文件** @param files 客户端上送的加密zip文件* @return 解压后的真实文件*/
public static File[] unzip(MultipartFile[] files) {List<File> list = new ArrayList<>();Arrays.stream(files).forEach(file -> {String filename = file.getOriginalFilename();if (Objects.isNull(filename)) {LogUtils.error(log, "文件名为空:filename:{}", filename);CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}// 加密密钥 【这里以文件名作为密钥,实际可使用更安全的密钥】String key = FileNameUtil.mainName(filename);String tempPath = workDir + "temp" + File.separator + filename + "-" + UUID.fastUUID() + File.separator;LogUtils.info(log, "zip加密密钥:{},临时文件目录:{}", key, tempPath);ZipFile encryptFile = new ZipFile(AppFileUtils.multipartFileToFile(file));encryptFile.setPassword(key.toCharArray());try {encryptFile.extractAll(tempPath);} catch (ZipException e) {LogUtils.error(log, "解压加密zip文件到临时目录异常: {}", e);CommonException.throwExp(ResultCode.AUDIT_RESOURCE_READ_ERROR);}// 获取解压出来的文件【这里只是读取临时目录的单个文件】File tempDirFile = getTempDirFile(tempPath);// 存储解压出来的临时文件,然后删除list.add(tempDirFile);// 这里使用的 hutool 的 api FileUtil.deldeleteTempFiles(tempPath);});return list.toArray(new MultipartFile[0]);
}

zipfile.setPassword(char[]):设置压缩文件的密码;

ZipFile.extract(); :解压文件到指定路径

zip 文件安全检查

/*** 上传文件安全检查* 1. 路径中不可包含../* 2. 文件名必须是.zip格式* 3. zip 必须加密** @param files 要上传的文件*/
public static void checkSecurity(MultipartFile[] files) {if (AppListUtils.isEmpty(Arrays.asList(files))) {LogUtils.warn(log, "上传文件为空");return;}Arrays.stream(files).forEach(file -> {String fileName = file.getOriginalFilename();// 路径中不可包含../if (Objects.isNull(fileName) || fileName.contains("../")) {LogUtils.error(log, "文件名称不合法");CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}String fileType = "";try {// hutoolfileType = FileTypeUtil.getType(file.getInputStream());} catch (Exception e) {LogUtils.error(log, "获取文件输入流异常:{}", e);}// 文件名必须是.zip格式, 文件必须以zip后缀if (!FileUtil.isExtendCompliance(fileName, "zip") || !"zip".equals(fileType)) {LogUtils.error(log, "文件后缀不合法");CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}// 必须是加密文件ZipFile zipFile = new ZipFile(AppFileUtils.multipartFileToFile(file));try {if (!zipFile.isEncrypted()) {LogUtils.error(log, "上传文件非加密文件");CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}} catch (ZipException e) {LogUtils.error(log, "上传文件判断加密异常: {}", e);CommonException.throwExp(ResultCode.AUDIT_RESOURCE_READ_ERROR);}});
}

zip文件加密、解密解压实操,附带文件上传安全检查相关推荐

  1. c语言文件加密解密单词统计,C语言文件加密解密及单词统计程序.doc

    C语言文件加密解密及单词统计程序.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 15.9 积分  高级语言程序设计 课程设计学 院 计算 ...

  2. 【C 语言】文件操作 ( 文件加密解密 | 解密文件 )

    文章目录 一.文件加密解密操作 1.解密整 4096 字节的数据 2.解密小于 4096 字节的数据 二.完整代码示例 1.文件加密操作 main.c 2.DES 加密解密头文件 des.h 3.第三 ...

  3. 【C 语言】文件操作 ( 文件加密解密 | 加密文件 )

    文章目录 一.文件加密解密操作 1.加密整 4096 字节的数据 2.加密小于 4096 字节的数据 二.完整代码示例 1.文件加密操作 2.DES 加密解密头文件 3.第三方 DES 加密解密函数库 ...

  4. Linux下实现文件加密解密

    Linux下利用异或加密解密算法实现文件加密解密 1.新建三个文件file1.file2.file2,分别用于存放原始数据.加密数据.解密数据.打开文件1写入原始数据.如图所示: 2.利用vi文本编辑 ...

  5. android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...

    zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...

  6. c语言编程文件的加密解密,C语言实现任何文件的加密解密功能

    本文实例为大家分享了C语言实现文件加密解密功能的具体代码,供大家参考,具体内容如下 使用命令提示符,实现任何文件的加密和解密功能. 代码如下: //#define _CRT_SECURE_NO_WAR ...

  7. java 文件进行加密解密,java 对文件加密解密,该如何解决

    java 对文件加密解密 本帖最后由 Hong_1993 于 2014-09-03 10:51:35 编辑 我现在想做一个基于spring mvc 模式的 实现对  文件或目录文件   的加解密(de ...

  8. 简单文件加密解密系统(c++)

    简单文件加密解密系统(c++) 一.原理 二.实现思路 三.c++代码 四.运行结果 一.原理   为了实现加解密,首先需要一个码本文件.一个基本的码本文件包含26个字母,即a~z打乱顺序的结果,比如 ...

  9. 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名

    批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名.bat 复制下面的内容保存成bat文件即可运行: @echo off rem 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名 ...

最新文章

  1. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
  2. POJ2931不平等博弈
  3. 微软软件推送服务器,微软将通过系统更新功能向大部分用户推送新版Microsoft Edge浏览器-...
  4. Openstack命令
  5. groupby java_Java8的groupBy实现集合的分组
  6. 学完这篇Charles抓包教程,我直接把fiddler卸载了
  7. git常用命令(史上最经典)
  8. java.lang.ClassNotFoundException: org.springframework.web.util.WebAppRootListener
  9. mac install: /usr/bin/unrar: Operation not permitted
  10. 理解MeasureSpec
  11. 大数据时代的大数据技术与应用有哪些
  12. 泛微OA主表与明细表的js操作
  13. Docker实用指令整理
  14. docker启动elasticsearch容器put数据时: SERVICE_UNAVAILABLE/1/state not recovered /initialized
  15. 01336软件项目管理复习
  16. iOS app 打包发布
  17. 全国计算机二级---公共基础部分知识点(自用总结)
  18. 服务器信号有杂音怎么回事,电脑麦克风有杂音滋滋怎么解决
  19. C#修改AD账号及密码
  20. 大数据背后的神秘公式:贝叶斯公式(万字长文)

热门文章

  1. php Wrapper LFI,PHP安全之LFI漏洞GetShell方法大阅兵
  2. 孕妇有什么副业做?孕妇在家有哪些兼职可以做?
  3. 支架预压弹性变形值计算_支架预压方案介绍 支架预压时间要多久
  4. linux运行windows程序6,linux 下通过wine 运行windows程序包括IE
  5. 启明星辰EDR长时间不访问导致拒绝连接的问题
  6. 计算机2级考试题目4
  7. 解析BeanFactory的核心方法——getBean
  8. MySQL快速导入数据
  9. 加快云原生技术转型, 智能调度登陆华为云DevOps: 增速,节源
  10. JavaScript的undefine和null