有手就会的 Java 处理压缩文件
@
前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、
提示:以下是本篇文章正文内容,下面案例可供参考
背景
在项目出现上传文件,其中文件包含压缩包,并对压缩包的内容进行解析保存。
第一步:编写代码
1.1 请求层
我们用倒叙的方式来写。先写 ZipController
@Autowired
private ZipService zipService;
/**
* 上传二维码文件
* @param qrCodeFile 二维码文件
* @return 返回上传的结果
*/
@ApiOperation(value = "上传二维码文件")
@PostMapping("/uploadQrCodeFile")
public Result uploadQrCodeFile(@RequestParam("file") MultipartFile qrCodeFile) throws Exception {
zipService.uploadQrCodeFile(qrCodeFile);
return Result.sendSuccess("上传成功");
}
1.2 业务处理层
接着就是写 Service
@Service
public class ZipService {
private static final Logger logger= LoggerFactory.getLogger(ZipService.class);
public void uploadQrCodeFile(MultipartFile multipartFile)throws Exception {
if (multipartFile.getSize() == 0
|| multipartFile.getOriginalFilename() == null
|| (multipartFile.getOriginalFilename() != null
&& !multipartFile.getOriginalFilename().contains("."))) {
ExceptionCast.cast(Result.sendFailure("文件格式不正确或文件为空!"));
}
// 1.先下载文件到本地
String originalFilename = multipartFile.getOriginalFilename();
String destPath = System.getProperty("user.dir") + File.separator + "qrCodeFile";
FileUtil.writeFromStream(
multipartFile.getInputStream(), new File(destPath + File.separator + originalFilename));
// 2.解压文件
unzipAndSaveFileInfo(originalFilename, destPath);
// 3.备份压缩文件,删除解压的目录
FileUtils.copyFile(
new File(destPath + File.separator + originalFilename),
new File(destPath + File.separator + "backup" + File.separator + originalFilename));
// 删除原来的上传的临时压缩包
FileUtils.deleteQuietly(new File(destPath + File.separator + originalFilename));
logger.info("文件上传成功,文件名为:{}", originalFilename);
}
/**
* 解压和保存文件信息
*
* @param originalFilename 源文件名称
* @param destPath 目标路径
*/
private void unzipAndSaveFileInfo(String originalFilename, String destPath) throws IOException {
if (StringUtils.isEmpty(originalFilename) || !originalFilename.contains(".")) {
ExceptionCast.cast(Result.sendFailure("文件名错误!"));
}
// 压缩
ZipUtil.unzip(
new File(destPath + File.separator + originalFilename),
new File(destPath),
Charset.forName("GBK"));
// 遍历文件信息
String fileName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
File[] files = FileUtil.ls(destPath + File.separator + fileName);
if (files.length == 0) {
ExceptionCast.cast(Result.sendFailure("上传文件为空!"));
}
String targetPath = destPath + File.separator + "images";
for (File file : files) {
// 复制文件到指定目录
String saveFileName =
System.currentTimeMillis() + new SecureRandom().nextInt(100) + file.getName();
FileUtils.copyFile(file, new File(targetPath + File.separator + saveFileName));
logger.info("文件名称:"+file.getName());
logger.info("文件所在目录地址:"+saveFileName);
logger.info("文件所在目录地址:"+targetPath + File.separator + saveFileName);
}
}
}
1.3 新增配置
因spring boot有默认上传文件大小限制,故需配置文件大小。在 application.properties
中添加 upload
的配置
#### upload begin ###
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.max-file-size=10MB
#### upload end ###
第二步:解压缩处理
2.1 引入依赖
引入 Apache
解压 / 压缩 工具类处理,解压 tar.gz
文件
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.20</version>
</dependency>
2.2 解压缩工具类
- 将
tar.gz
转换为tar
- 解压
tar
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
// tar.gz 文件路径
String sourcePath = "D:\\daleyzou.tar.gz";
// 要解压到的目录
String extractPath = "D:\\test\\daleyzou";
File sourceFile = new File(sourcePath);
// decompressing *.tar.gz files to tar
TarArchiveInputStream fin = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(sourceFile)));
File extraceFolder = new File(extractPath);
TarArchiveEntry entry;
// 将 tar 文件解压到 extractPath 目录下
while ((entry = fin.getNextTarEntry()) != null) {
if (entry.isDirectory()) {
continue;
}
File curfile = new File(extraceFolder, entry.getName());
File parent = curfile.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
// 将文件写出到解压的目录
IOUtils.copy(fin, new FileOutputStream(curfile));
}
总结
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!
有手就会的 Java 处理压缩文件的更多相关文章
- java ZIP压缩文件
问题描述: 使用java ZIP压缩文件和目录 问题解决: (1)单个文件压缩 注: 以上是实现单个文件写入压缩包的代码,注意其中主要是在ZipOutStream流对象中创建Z ...
- java ZipOutputStream压缩文件,ZipInputStream解压缩
java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...
- java生成压缩文件
在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...
- java打包压缩文件
package com.it.simple.util; import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream ...
- Java实现压缩文件与解压缩文件
由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包:但是Java自带的工具包存在问题:如果压缩或 ...
- java zip 压缩文件
zip压缩:ZipOutputStream.ZipFile.ZipInputStream 三个类的作用 一段 java zip 压缩的代码: File dir = new File("C ...
- java对压缩文件进行加密,winrar和好压 直接输入解密密码来使用
<!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j --> <dependency> <gro ...
- Java生成压缩文件(zip、rar 格式)
jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...
- Java读取压缩文件信息
不解压压缩文件,获取其中包含的文件,通过文件名检查是否包含非法文件.(后续再根据文件头或内容吧) zip: import java.util.zip.ZipEntry;import java.util ...
- java zip压缩文件和文件夹
public class FileUtil { /** * 压缩文件-File * @param out zip流 * @param srcFiles 要压缩的文件 * @param path 相对路 ...
随机推荐
- R6_ES在互联网公司应用案例汇总参考
Elasticsearch 是一个实时分布式搜索数据分析引擎,内部使用lucene做索引与搜索,能够解决常规和各种类型数据的存储及检索需求,典型的应用场景有:数据分析,站内搜索,ELK,电商等,主要特 ...
- go http请求如果参数中带有"等特殊字符,参数传输可能会出现问题
编码完整的URL url.QueryEscape(urlStr) 编码完整的URL 如果我们要对完整的 URL 进行编码呢? 就是PHP中 urlencode() 函数的功能. 在 GO 语言下可以直 ...
- GROK 一个强大的调试工具
GROK 在线工具 在线英文版地址 http://grokconstructor.appspot.com/ 中文翻译版 GitHub https://github.com/systemmin/Grok ...
- linux源码编译安装软件原理
目录 一.关于软件包 二.软件编译过程 三.编译安装常用参数 四.源码编译出错的解决思路 五.各种软件安装方法的特点 一.关于软件包 在linux中安装软件是需要安装包的,软件的安装包有各种类型: ...
- Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)
1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) @ 目录 1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) 每博一文案 2. 大概的实现步骤概 ...
- 拼凑一个ABP VNext管理后台拼凑一个ABP VNext管理后台
介绍# 本项目前后端分离,后端采用ABP VNext框架,前端Vue.项目地址: https://github.com/pojianbing/AuthCenter 目前包含的模块有: 身份认证管理 I ...
- 23ai中的True Cache到底能做啥?
最近,Oracle的产品管理总监在Oracle数据库内幕中介绍了True Cache. 原文链接如下: https://blogs.oracle.com/database/post/introduci ...
- 采用Dapr 的IoT 案例
CNCF 发布了一篇Dapr 的IoT 案例:Tempestive uses Dapr and K8s to track IoT messages | CNCF.Tempestive 是一家物联网解决 ...
- 用C++ Qt实现类似Photoshop的钢笔工具
因为工作上的需求,需要实现一个类似Photoshop里面的钢笔工具, 分析一下它的功能,包括: 1. 有两种点:节点和控制点,节点是构成图形的基本端点,控制点是影响贝塞尔曲线的系数. 2. 创建节点: ...
- CF98C Help Greg the Dwarf 题解
CF98C Help Greg the Dwarf 题解 为什么不三分? 首先我们考虑如何求出答案. 如图,考虑设夹角为 \(\theta\),那么可以得到表达式: \[[\cfrac a {\tan ...