diff --git a/o2server/pom.xml b/o2server/pom.xml index 3f3ecf53de048f9ad6133e056189f7bf309040b5..a5b8d8cbab1fb0a9efd49a119903d4e24554dd18 100644 --- a/o2server/pom.xml +++ b/o2server/pom.xml @@ -294,7 +294,7 @@ com.squareup javapoet - com.github.neuroph @@ -348,6 +348,10 @@ javax.activation activation + + net.lingala.zip4j + zip4j + @@ -785,7 +789,7 @@ javapoet 1.11.1 - com.github.neuroph @@ -1002,6 +1006,11 @@ x_workschedu_core_entity 5.3 + + net.lingala.zip4j + zip4j + 2.3.2 + diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ZipTools.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ZipTools.java new file mode 100644 index 0000000000000000000000000000000000000000..59574df9e21f661eddd6527faaba7996f11268e1 --- /dev/null +++ b/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 subs, File dist, boolean asNew, Charset charset) { + try{ + ZipFile zipFile = new ZipFile(source); + if(charset == null){ + charset = DefaultCharset.charset; + } + zipFile.setCharset(charset); + List 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; + } +} diff --git a/o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java b/o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java index 95cd13183103e44e24d97a0a9a0fbd8e252f49ef..4d5b2684573ce6dc6cf972d6025db1d50593641d 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java +++ b/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 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 subs = new ArrayList<>(); - JarTools.unjar(zipFile, subs, dist, false); + ZipTools.unZip(zipFile, subs, dist, false, null); FileUtils.cleanDirectory(tempFile);