Browse Source

fix zip bug

Looly 6 years ago
parent
commit
5ee0a73ebb

+ 1 - 0
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)
 
 -------------------------------------------------------------------------------------------------------------
 

+ 9 - 3
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);
 	}

+ 5 - 3
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