From 5ee0a73ebb6517ac487ae39511a77237e176b0eb Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 14 Dec 2019 09:03:51 +0800 Subject: [PATCH] fix zip bug --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/core/util/ZipUtil.java | 12 +++++++++--- .../test/java/cn/hutool/core/util/StrUtilTest.java | 8 +++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc5031abd..4ed7ba27e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ### Bug修复 * 【db 】 修复SqlExecutor.callQuery关闭Statement导致的问题(issue#I16981@Gitee) * 【db 】 修复XmlUtil.xmlToMap中List节点的问题(pr#82@Gitee) +* 【core】 修复ZipUtil中对于/结尾路径处理的问题(issue#I16PKP@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java index 0a061c478..dcb73750a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java @@ -485,6 +485,7 @@ public class ZipUtil { outItemFile = FileUtil.file(outFile, zipEntry.getName()); if (zipEntry.isDirectory()) { // 目录 + //noinspection ResultOfMethodCallIgnored outItemFile.mkdirs(); } else { // 文件 @@ -900,6 +901,7 @@ public class ZipUtil { addDir(subPath, out); } // 压缩目录下的子文件或目录 + //noinspection ConstantConditions for (File childFile : files) { zip(childFile, srcRootDir, out, filter); } @@ -1034,6 +1036,7 @@ public class ZipUtil { * @param out 输出 * @param nowrap true表示兼容Gzip压缩 */ + @SuppressWarnings("SameParameterValue") private static void inflater(InputStream in, OutputStream out, boolean nowrap) { final InflaterOutputStream ios = (out instanceof InflaterOutputStream) ? (InflaterOutputStream) out : new InflaterOutputStream(out, new Inflater(nowrap)); IoUtil.copy(in, ios); @@ -1052,6 +1055,7 @@ public class ZipUtil { * @param level 压缩级别,0~9 * @param nowrap true表示兼容Gzip压缩 */ + @SuppressWarnings("SameParameterValue") private static void deflater(InputStream in, OutputStream out, int level, boolean nowrap) { final DeflaterOutputStream ios = (out instanceof DeflaterOutputStream) ? (DeflaterOutputStream) out : new DeflaterOutputStream(out, new Deflater(level, nowrap)); IoUtil.copy(in, ios); @@ -1071,7 +1075,9 @@ public class ZipUtil { * @since 5.0.5 */ private static File buildFile(File outFile, String fileName) { - if (false == FileUtil.isWindows() && StrUtil.contains(fileName, CharUtil.SLASH)) { + if (false == FileUtil.isWindows() + // 检查文件名中是否包含"/",不考虑以"/"结尾的情况 + && fileName.lastIndexOf(CharUtil.SLASH, fileName.length() - 2) > 0) { // 在Linux下多层目录创建存在问题,/会被当成文件名的一部分,此处做处理 // 使用/拆分路径(zip中无\),级联创建父目录 final String[] pathParts = StrUtil.splitToArray(fileName, CharUtil.SLASH); @@ -1081,8 +1087,8 @@ public class ZipUtil { } //noinspection ResultOfMethodCallIgnored outFile.mkdirs(); - // 最后一个部分作为文件名 - fileName = pathParts[pathParts.length -1]; + // 最后一个部分如果非空,作为文件名 + fileName = pathParts[pathParts.length - 1]; } return FileUtil.file(outFile, fileName); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java index f4d537426..939176c5e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java @@ -1,11 +1,10 @@ package cn.hutool.core.util; -import java.util.List; - +import cn.hutool.core.lang.Dict; import org.junit.Assert; import org.junit.Test; -import cn.hutool.core.lang.Dict; +import java.util.List; /** * 字符串工具类单元测试 @@ -57,6 +56,9 @@ public class StrUtilTest { Assert.assertEquals(5, split.size()); // 测试去掉两边空白符是否生效 Assert.assertEquals("b", split.get(1)); + + final String[] strings = StrUtil.splitToArray("abc/", '/'); + Assert.assertEquals(2, strings.length); } @Test