public static void unzip(String zipFilePath, String destDirectory) {
File dir = new File(destDirectory);
// 如果目标文件夹不存在,则创建
if (!dir.exists()) {
dir.mkdirs();
}
byte[] buffer = new byte[1024];
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) {
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File newFile = newFile(dir, zipEntry);
if (zipEntry.isDirectory()) {
// 创建目录
newFile.mkdirs();
} else {
// 创建父目录
newFile.getParentFile().mkdirs();
// 写入文件
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile))) {
int len;
while ((len = zis.read(buffer)) > 0) {
bos.write(buffer, 0, len);
}
}
}
zipEntry = zis.getNextEntry();
}
zis.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
// 保护文件路径,防止ZipPathTraversal攻击
private static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {
File destFile = new File(destinationDir, zipEntry.getName());
String destDirPath = destinationDir.getCanonicalPath();
String destFilePath = destFile.getCanonicalPath();
if (!destFilePath.startsWith(destDirPath + File.separator)) {
throw new IOException("Entry is outside of the target directory: " + zipEntry.getName());
}
return destFile;
}
上述代码报错,原因是编码问题,需要