所需依赖
<!-- ant zip解压-->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.7</version>
</dependency>
创建工具类
/**
* 保存zip文件到本地并调用解压方法并返回解压出的文件的路径集合
*
* @param file 文件
* @return list //解压出的文件的路径合集
*/
public List<String> batchadd(MultipartFile file) {
/*
*创建临时文件夹
* 解压文件
*/
String fileName = file.getOriginalFilename();
String path = zipPath;
File dir = new File(path);
dir.mkdirs();
String filePath = zipPath + "/test/";
File fileDir = new File(filePath);
fileDir.mkdirs();
File saveFile = new File(fileDir, fileName);//将压缩包解析到指定位置
List<String> list = new ArrayList<>();
try {
file.transferTo(saveFile);
String newFilePath = filePath + fileName;
File zipFile = new File(newFilePath);
list = unZipFiles(zipFile, path);//解压文件,获取文件路径
} catch (Exception e) {
e.printStackTrace();
log.error("解压执行失败");
}
//程序结束时,删除临时文件
deleteFiles(filePath);//删除压缩包文件夹
//deleteFiles(path);//删除解压文件夹**
return list;
}
/**
* zip解压
*
* @param srcFile zip源文件
* @param destDirPath 解压后的目标文件夹
* @return list 解压文件的路径合集
* @throws RuntimeException 解压失败会抛出运行时异常
*/
public static List<String> unZipFiles(File srcFile, String destDirPath) throws RuntimeException {
List<String> list = new ArrayList<>();
long start = System.currentTimeMillis();
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
}
// 开始解压
ZipFile zipFile = null;
try {
zipFile = new ZipFile(srcFile);
Enumeration<?> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
log.info("解压" + entry.getName());
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
String dirPath = destDirPath + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(destDirPath + entry.getName());
// 保证这个文件的父文件夹必须要存在
list.add(destDirPath + entry.getName());
if (!targetFile.getParentFile().exists()) {
log.info("父文件不存在");
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
}
}
long end = System.currentTimeMillis();
log.info("解压完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("unzip error from ZipUtils", e);
} finally {
if (zipFile != null) {
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return list;
}
/**
* @param filePath 临时文件的删除
* 删除文件夹里面子目录
* 再删除文件夹
*/
public void deleteFiles(String filePath) {
File file = new File(filePath);
if ((!file.exists()) || (!file.isDirectory())) {
log.info("file not exist");
return;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (filePath.endsWith(File.separator)) {
temp = new File(filePath + tempList[i]);
} else {
temp = new File(filePath + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
this.deleteFiles(filePath + "\\" + tempList[i]);
}
}
// 空文件的删除
file.delete();
}
接收前端上传的文件并解压
@PostMapping(value = "/analysisFile")
public void analysisFile(HttpServletRequest request) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
try {
MultipartFile multipartFile = entity.getValue();// 获取上传文件对象
List<String> filePathList = Util.batchadd(multipartFile )//调用解压方法并获取解压出来的文件地址
} catch (Exception e) {
log.error("文件解析失败!");
return Result.Error("文件解析失败!");
}
}