解压缩zip包

public static void main(String[] args) {
        unpack(new File("D:\\测试包\\ceshiziliao.zip"), new File("D:\\yasuolujing"));
    }
    /**
     * 解压 zip
     *
     * @param zipFile
     * @param descDir
     */
    public static void unpack(File zipFile, File descDir) {
        try (ZipInputStream inputStream = new ZipInputStream(new FileInputStream(zipFile), Charset.forName("GBK"))) {
            if (!descDir.exists()) {
                descDir.mkdirs();
            }
            ZipEntry zipEntry = null;
            File outfile = null;
            while ((zipEntry = inputStream.getNextEntry()) != null) {
                outfile = checkFileDir(descDir, zipEntry.getName());
                if (zipEntry.isDirectory()) {
                    outfile.mkdirs();
                } else {
                    OutputStream os = null;
                    try {
                        os = new BufferedOutputStream(new FileOutputStream(new File(descDir, zipEntry.getName())));
                        IOUtils.copy(inputStream, os);
                    } finally {
                        IOUtils.closeQuietly(os);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * zip 条目覆盖漏洞校验
     * 防止压缩包内文件名称包含路径 例:../a.jpg
     *
     * @param destDir
     * @param fileName
     * @return
     */
    public static File checkFileDir(File destDir, String fileName) {
        File destFile = new File(destDir, fileName);
        String destDirPath = "";
        String destFilePath = "";
        try {
            destDirPath = destDir.getCanonicalPath();
            destFilePath = destFile.getCanonicalPath();
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }
        if (!destFilePath.startsWith(destDirPath + File.separator)) {
            throw new RuntimeException("文件不在许可目录内!");
        }
        // 防止压缩包一级目录只有文件夹时,解压报错找不到文件
        File parentDir = destFile.getParentFile();
        if(!parentDir.exists()){
            parentDir.mkdirs();
        }
        return destFile;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值