From 9ce17255a9fa9333db651c55b28103eedaee17ec Mon Sep 17 00:00:00 2001 From: o2sword <171715986@qq.com> Date: Fri, 8 Jan 2021 18:03:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86zip=E4=B8=AD=E6=9C=89?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E6=96=87=E4=BB=B6=E8=A7=A3=E5=8E=8B=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E6=96=87=E4=BB=B6=E6=88=96=E4=B9=B1=E7=A0=81=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- o2server/pom.xml | 13 +++- .../x/base/core/project/tools/ZipTools.java | 76 +++++++++++++++++++ .../java/com/x/server/console/NodeAgent.java | 4 +- 3 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ZipTools.java diff --git a/o2server/pom.xml b/o2server/pom.xml index 3f3ecf53de..a5b8d8cbab 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 0000000000..59574df9e2 --- /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 95cd131831..4d5b268457 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); -- GitLab