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

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

上级 2d36a19f
......@@ -348,6 +348,10 @@
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
</dependency>
</dependencies>
<build>
......@@ -1002,6 +1006,11 @@
<artifactId>x_workschedu_core_entity</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
</dependencyManagement>
<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 {
FileTools.forceMkdir(dist);
}
List<String> subs = new ArrayList<>();
JarTools.unjar(zipFile, subs, dist, asNew);
ZipTools.unZip(zipFile, subs, dist, asNew, null);
FileUtils.cleanDirectory(tempFile);
logger.print("upload resource {} success!", fileName);
......@@ -655,7 +655,7 @@ public class NodeAgent extends Thread {
FileUtils.writeByteArrayToFile(zipFile, bytes);
File dist = Config.dir_custom(true);
List<String> subs = new ArrayList<>();
JarTools.unjar(zipFile, subs, dist, false);
ZipTools.unZip(zipFile, subs, dist, false, null);
FileUtils.cleanDirectory(tempFile);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册