Răsfoiți Sursa

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

o2sword 5 ani în urmă
părinte
comite
ee49ed3c40

+ 11 - 2
o2server/pom.xml

@@ -294,7 +294,7 @@
 			<groupId>com.squareup</groupId>
 			<artifactId>javapoet</artifactId>
 		</dependency>
-		<!-- dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId> 
+		<!-- dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId>
 			</dependency -->
 		<dependency>
 			<groupId>com.github.neuroph</groupId>
@@ -348,6 +348,10 @@
 			<groupId>javax.activation</groupId>
 			<artifactId>activation</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>net.lingala.zip4j</groupId>
+			<artifactId>zip4j</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>
@@ -785,7 +789,7 @@
 				<artifactId>javapoet</artifactId>
 				<version>1.11.1</version>
 			</dependency>
-			<!--dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId> 
+			<!--dependency> <groupId>javax.visrec</groupId> <artifactId>visrec-api</artifactId>
 				<version>20200316</version> </dependency -->
 			<dependency>
 				<groupId>com.github.neuroph</groupId>
@@ -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>

+ 76 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ZipTools.java

@@ -0,0 +1,76 @@
+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;
+    }
+}

+ 2 - 2
o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java

@@ -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);