提交 9ce17255 编写于 作者: O o2sword

处理zip中有中文文件解压丢失文件或乱码的问题

上级 2d36a19f
...@@ -294,7 +294,7 @@ ...@@ -294,7 +294,7 @@
<groupId>com.squareup</groupId> <groupId>com.squareup</groupId>
<artifactId>javapoet</artifactId> <artifactId>javapoet</artifactId>
</dependency> </dependency>
<!-- dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId> <!-- dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId>
</dependency --> </dependency -->
<dependency> <dependency>
<groupId>com.github.neuroph</groupId> <groupId>com.github.neuroph</groupId>
...@@ -348,6 +348,10 @@ ...@@ -348,6 +348,10 @@
<groupId>javax.activation</groupId> <groupId>javax.activation</groupId>
<artifactId>activation</artifactId> <artifactId>activation</artifactId>
</dependency> </dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
...@@ -785,7 +789,7 @@ ...@@ -785,7 +789,7 @@
<artifactId>javapoet</artifactId> <artifactId>javapoet</artifactId>
<version>1.11.1</version> <version>1.11.1</version>
</dependency> </dependency>
<!--dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId> <!--dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId>
<version>20200316</version> </dependency --> <version>20200316</version> </dependency -->
<dependency> <dependency>
<groupId>com.github.neuroph</groupId> <groupId>com.github.neuroph</groupId>
...@@ -1002,6 +1006,11 @@ ...@@ -1002,6 +1006,11 @@
<artifactId>x_workschedu_core_entity</artifactId> <artifactId>x_workschedu_core_entity</artifactId>
<version>5.3</version> <version>5.3</version>
</dependency> </dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<repositories> <repositories>
......
package com.x.base.core.project.tools;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ExtraDataRecord;
import net.lingala.zip4j.model.FileHeader;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.List;
public class ZipTools {
public static void unZip(File source, List<String> subs, File dist, boolean asNew, Charset charset) {
try{
ZipFile zipFile = new ZipFile(source);
if(charset == null){
charset = DefaultCharset.charset;
}
zipFile.setCharset(charset);
List<FileHeader> fileHeaderList = zipFile.getFileHeaders();
for (FileHeader fileHeader : fileHeaderList){
if(isFromExtraData(fileHeader) && DefaultCharset.charset.name() == charset.name()){
unZip(source, subs, dist, asNew, DefaultCharset.charset_gbk);
return;
}
String name = fileHeader.getFileName();
//System.out.println(name);
if (name.length() < 2) {
continue;
}
if (subs != null) {
boolean flag = false;
for (String sub : subs) {
if (StringUtils.startsWith(name, sub)) {
flag = true;
break;
}
}
if (flag) {
continue;
}
}
if (fileHeader.isDirectory()) {
File dir = new File(dist, name);
if (dir.exists() && name.indexOf("/") == name.lastIndexOf("/") && asNew) {
FileUtils.cleanDirectory(dir);
}
FileUtils.forceMkdir(dir);
} else {
zipFile.extractFile(fileHeader, dist.getAbsolutePath());
}
}
fileHeaderList.clear();
}catch (Exception e){
e.printStackTrace();
}
}
public static boolean isFromExtraData(FileHeader fileHeader) {
if(fileHeader.getExtraDataRecords()!=null){
for (ExtraDataRecord extraDataRecord : fileHeader.getExtraDataRecords()) {
long identifier = extraDataRecord.getHeader();
if (identifier == 0x7075) {
byte[] bytes = extraDataRecord.getData();
ByteBuffer buffer = ByteBuffer.wrap(bytes);
byte version = buffer.get();
assert (version == 1);
return true;
}
}
}
return false;
}
}
...@@ -378,7 +378,7 @@ public class NodeAgent extends Thread { ...@@ -378,7 +378,7 @@ public class NodeAgent extends Thread {
FileTools.forceMkdir(dist); FileTools.forceMkdir(dist);
} }
List<String> subs = new ArrayList<>(); List<String> subs = new ArrayList<>();
JarTools.unjar(zipFile, subs, dist, asNew); ZipTools.unZip(zipFile, subs, dist, asNew, null);
FileUtils.cleanDirectory(tempFile); FileUtils.cleanDirectory(tempFile);
logger.print("upload resource {} success!", fileName); logger.print("upload resource {} success!", fileName);
...@@ -655,7 +655,7 @@ public class NodeAgent extends Thread { ...@@ -655,7 +655,7 @@ public class NodeAgent extends Thread {
FileUtils.writeByteArrayToFile(zipFile, bytes); FileUtils.writeByteArrayToFile(zipFile, bytes);
File dist = Config.dir_custom(true); File dist = Config.dir_custom(true);
List<String> subs = new ArrayList<>(); List<String> subs = new ArrayList<>();
JarTools.unjar(zipFile, subs, dist, false); ZipTools.unZip(zipFile, subs, dist, false, null);
FileUtils.cleanDirectory(tempFile); FileUtils.cleanDirectory(tempFile);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册