前言

目前手中有个项目,需要做到用户打包图片上传处理的逻辑,这个时候,就需要用到一个JAVA的压缩/解压库Apache Commons Compress

  • 从压缩文件中逐个读取文件(废话,肯定从里面读啦)。
  • 读取文件的文件名进行业务逻辑判断(文件名跟业务编号有关)。
  • 上传之后返回一个信息说哪些成功、哪些失败、哪些异常或没有权限。

WHats Apache Commons Compress?

Apache Commons Compress,Compress是ApacheCommons提供压缩解压缩文件的类库,定义了一个用于处理ar,cpio,Unix dump,tar,zip,gzip,XZ,Pack200,bzip2、7z,arj,lzma,snappy,DEFLATE,lz4,Brotli,Zstandard,DEFLATE64和Z文件的API ,非常强大。

官网 http://commons.apache.org/proper/commons-compress/

POM.xml

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.20</version>
</dependency>

核心代码

假设文件以及成功上传到目标文件夹(本文不涉及上传,只讲解解压)

ArchiveInputStream archiveInputStream = factory.createArchiveInputStream(ArchiveStreamFactory.ZIP,inputStream);
代表解压ZIP文件,也支持一下文件:

业务代码:

    public ReturnT importImage(String filename,Integer roleId,Integer userId){List<String> resultList = new ArrayList<>(24);File archiveFile = new File(storageService.getPathString()+filename);File outputDir = new File(storageService.getPathString()+userId);// 指定文件所用字符集,这里以UTF-8为例ArchiveStreamFactory factory = new ArchiveStreamFactory("UTF-8");try {InputStream inputStream = new FileInputStream(archiveFile);//暂定解压ZIP文件ArchiveInputStream archiveInputStream = factory.createArchiveInputStream(ArchiveStreamFactory.ZIP,inputStream);ArchiveEntry archiveEntry = null;OutputStream outputStream;File outputFile;byte[] buffer = new byte[512];int bytesRead;while ((archiveEntry = archiveInputStream.getNextEntry()) != null) {//获取完整文件名String filenameInZip =archiveEntry.getName();//从最后一.开始切割获取证书编号String certNumber = filenameInZip.substring(0,filenameInZip.lastIndexOf("."));Cert cert = certMapper.selectOne(new QueryWrapper<Cert>().eq("cert_number",certNumber));if(cert==null){log.info("unzip-证书不存在:{} 证书上传者roleId{} userId:{}",certNumber,roleId,userId);resultList.add(certNumber+":证书不存在");}else if(roleId==9|| userId.equals(cert.getUserId())){log.info("unzip-证书上传成功:{} 证书上传者roleId{} userId:{}",certNumber,roleId,userId);//判断文件对应的certNumber是否拥有权限outputFile = new File(outputDir, filenameInZip);if (!outputFile.getParentFile().exists()) {outputFile.getParentFile().mkdirs();}outputStream = new FileOutputStream(outputFile);// 进行数据拷贝while ((bytesRead = archiveInputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, bytesRead);}outputStream.close();cert.setCertImg(userId+"/"+filenameInZip);cert.setUpdateTime(new Date());certMapper.updateById(cert);resultList.add(certNumber+":证书上传成功");}else{log.info("unzip-权限错误:{} 证书上传者roleId{} userId:{}",certNumber,roleId,userId);resultList.add(certNumber+":权限错误");}}} catch (Exception e) {e.printStackTrace();}return ReturnT.SUCCESS(resultList);}

效果查看

前端可以显示什么上传成功

上传目录可以看到成功的文件已經解压,其它不需要处理的文件已經忽略。

关于ArchiveStreamFactory

关于ArchiveStreamFactory的信息,可以在一下javadoc中找到,包含解压zip压缩包和压缩成zip安装包。

#ClassInfo
public class ArchiveStreamFactory
extends java.lang.Object
implements ArchiveStreamProvider#Description:
Factory to create Archive[In|Out]putStreams from names or the first bytes of the InputStream. In order to add other implementations, you should extend ArchiveStreamFactory and override the appropriate methods (and call their implementation from super of course). ### Compressing a ZIP-File:final OutputStream out = Files.newOutputStream(output.toPath());ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml"));IOUtils.copy(Files.newInputStream(file1.toPath()), os);os.closeArchiveEntry();os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml"));IOUtils.copy(Files.newInputStream(file2.toPath()), os);os.closeArchiveEntry();os.close();### Decompressing a ZIP-File:final InputStream is = Files.newInputStream(input.toPath());ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.ZIP, is);ZipArchiveEntry entry = (ZipArchiveEntry)in.getNextEntry();OutputStream out = Files.newOutputStream(dir.toPath().resolve(entry.getName()));IOUtils.copy(in, out);out.close();in.close();

JAVA压缩/解压ZIP/7Z文件(by Apache Commons Compress)相关推荐

  1. java 7zip解压_Apache Commons Compress介绍-JAVA压缩解压7z文件

    7zip(下面简称7z)是由Igor Pavlov所开发的一种压缩格式,主要使用的压缩算法是LZMA/LZMA2.7z是一种压缩比非常高的格式,这与其压缩算法LZMA有直接关系,所以很多大文件都是用7 ...

  2. android zip格式应用,Android 压缩解压zip文件

    Android 压缩解压zip文件 上次写了个解压缩功能,但有局限性,比如压缩文件xx.zip 里包括子目录的情况下,执行上次解压缩的功能就不能实现我们想要的效果,于是在网上参考了一下java的解压缩 ...

  3. VC++压缩解压zip文件(支持密码)

    只能压缩解压zip格式的,不需要dll或者库文件,核心是HZIP,支持带密码压缩解压(但是有时不完美,属于HZIP本身的问题,请不要纠结这一点). 以下为核心封装文件,建议大家下载源代码查看,下载地址 ...

  4. Python压缩解压zip,Django下载zip文件

    Python压缩解压zip 压缩 import zipfile def convert_zip(zip_path, save_path):'''# zip_path 要压缩文件的路径# save_pa ...

  5. 使用InfoZip压缩解压zip文件

    使用InfoZip压缩解压zip文件 源码下载地址:http://download.csdn.net/detail/risingsun001/4254821 先贴部分源码: void CInfozip ...

  6. fatjar打包mysql_一个简单的解压ZIP Excl文件---gt;按时间读取Excle文件,通过Fat jar打成jar相对应的添加到mysql数据库中。 - 明月 - ITeye博客...

    写道 一个简单的解压ZIP Excl文件--->按时间读取Excle文件,通过Fat jar打成jar相对应的添加到mysql数据库中. package common.gaoyang; impo ...

  7. java 压缩解压密码zip_Java解压和压缩带密码的zip文件过程详解|chu

    前言 JDK自带的ZIP操作接口(java.util.zip包,请参看文章末尾的博客链接)并不支持密码,甚至也不支持中文文件名. 为了解决ZIP压缩文件的密码问题,在网上搜索良久,终于找到了winzi ...

  8. java压缩解压文件工具类

    controller中使用 @PostMapping(value = "/importZip")public Result<?> importExcel(HttpSer ...

  9. java代码解压ZIP文件

    1.ZipInputStream类可读取ZIP压缩格式的文件,包括已压缩和未压缩的条目(entry).ZipInputStream类的构造方法如下:ZipInputStream(InputStream ...

  10. C#压缩解压zip 文件

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手.只好耐下心来, ...

最新文章

  1. 在python中,小数点前的0可以省略不写...
  2. Redis的搭建和Redis的集群搭建
  3. 用Python实现-----按要求修改文件名
  4. 四十、ETL工具的输入步骤
  5. Linq to xml:使用 XSLT 转换 XML 树
  6. 看代码学知识之(2) ListView无数据时显示其他View
  7. leetcode586. 订单最多的客户(SQL)
  8. html5站点是什么意思,html5是什么意思(html5是什么技术)
  9. 修改hosts文件无效?附解决办法
  10. 在CNDS博客中插入Latex公式
  11. 启天m7300微型计算机,启天M7300
  12. JS设计模式-单例模式
  13. 移动硬盘拒绝访问问题解决方法
  14. Deecamp夏令营面试及结营体验
  15. 车内看车头正不正技巧_侧方位停车把把入库技巧,驾校没教的中途修正方法很实用...
  16. 实行计算机远程网上录取.啥意思,河北高考今年继续实行计算机远程网上录取...
  17. 区块链的未来发展和前景会如何呢?
  18. 宽依赖和窄依赖_【Spark】SparkCore解析(一):宽依赖和窄依赖
  19. 光纤收发器的原理及应用_光纤收发器的工作原理 光纤收发器的作用介绍
  20. 想考计算机硕士,该怎么规划?

热门文章

  1. 传感技术复习笔记(10)——光纤传感器
  2. 浅谈工业4.0时代,深信服adesk桌面云如何助力智能工厂.
  3. g4600黑苹果efi_如何找到自己电脑合适的efi引导文件替换u盘的efi
  4. 罗技GHub驱动长时间加载/初始化【完美解决】
  5. TongWeb8知识总结
  6. (20191123)matlab绘制指定数值的等高线并添加标注+Matlab绘制平行x或y轴或任意直线
  7. Visual Studio 2013 、Matlab 2014产品密钥
  8. 李宏毅机器学习Regression
  9. 简单的MQTT客户端工具
  10. SAP-ABAP-查找后台表修改记录