ZipUtil.unzip增加编码容错(issue#I3UZ28@Gitee)

This commit is contained in:
Looly 2024-11-13 12:35:49 +08:00
parent d88eac0dac
commit 9b3709ad45
2 changed files with 30 additions and 7 deletions

View File

@ -33,7 +33,6 @@ import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ByteUtil;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.core.util.ObjUtil;
import java.io.*;
import java.nio.charset.Charset;
@ -45,10 +44,7 @@ import java.util.Enumeration;
import java.util.List;
import java.util.function.Consumer;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import java.util.zip.*;
/**
* 压缩工具类
@ -72,10 +68,24 @@ public class ZipUtil {
* @param charset 解析zip文件的编码null表示{@link CharsetUtil#UTF_8}
* @return {@link ZipFile}
*/
public static ZipFile toZipFile(final File file, final Charset charset) {
public static ZipFile toZipFile(final File file, Charset charset) {
if(null == charset){
charset = CharsetUtil.UTF_8;
}
try {
return new ZipFile(file, ObjUtil.defaultIfNull(charset, CharsetUtil.UTF_8));
return new ZipFile(file, charset);
} catch (final IOException e) {
// issue#I3UZ28 可能编码错误提示
if(e instanceof ZipException){
if(e.getMessage().contains("invalid CEN header")){
try {
// 尝试使用不同编码
return new ZipFile(file, CharsetUtil.UTF_8.equals(charset) ? CharsetUtil.GBK : CharsetUtil.UTF_8);
} catch (final IOException ex) {
throw new IORuntimeException(ex);
}
}
}
throw new IORuntimeException(e);
}
}

View File

@ -0,0 +1,13 @@
package org.dromara.hutool.core.compress;
import org.dromara.hutool.core.io.file.FileUtil;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
public class IssueI3UZ28Test {
@Test
@Disabled
void unzipWithGBKTest() {
ZipUtil.unzip(FileUtil.file("d:/test/test.zip"));
}
}