PHP 解压 ZIP 压缩包,解决多级中文乱码问题

这篇博客介绍了如何在PHP中使用ZipArchive类处理ZIP压缩包,包括正常解压和解决中文乱码问题。提供了详细的代码示例,涵盖了从打开ZIP文件、检查目录、转换编码到保存文件或创建目录的步骤,确保在Windows和Linux环境下都能正确解压并处理中文文件名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境windows10
正常的zip解压在网上百度都能找到

一、 不考虑乱码等问题

$zip = new \ZipArchive;
$zipfile = “./test.zip”;
$res = z i p − > o p e n ( zip->open( zip>open(zipfile);
$s = $zip->extractTo(‘解压保存目录’)

二、解决中文乱码

KaTeX parse error: Undefined control sequence: \ZipArchive at position 11: zip = new \̲Z̲i̲p̲A̲r̲c̲h̲i̲v̲e̲(); if (zip->open(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(!is_dir(path)){
mkdir($path, 0777, true);
}
// 获取解压的文件数组
$fileNum = $zip->numFiles;

for ($i = 0; $i < $fileNum; $i++) {
    // 处理每一个文件
    $statInfo = $zip->statIndex($i, \ZipArchive::FL_ENC_RAW);
    // 获取文件的名称的编码格式
    $encoding = mb_detect_encoding($statInfo['name'], ['UTF-8','GBK','BIG5','CP936']);

    // 转换成UTF-8编码
    if (DIRECTORY_SEPARATOR == '/'){    //linux
        $filename = iconv($encoding, 'UTF-8', $statInfo['name']);
    }else{  //win
        $filename = iconv($encoding, 'UTF-8', $statInfo['name']);
    }

    if($statInfo['crc'] == 0) {
        //新建目录
        //mkdir($path.'/'.substr($filename, 0,-1));
        mkdir($path, 0777, true);
    } else {
            if(!copy('zip://' . $filePath . '#' . $zip->getNameIndex($i), $path . '/' . $filename)){
                return false;
            } 
    }
}
$zip->close();
return true;

} else {
return false;
}

三、对比二只加了一段代码

KaTeX parse error: Undefined control sequence: \ZipArchive at position 11: zip = new \̲Z̲i̲p̲A̲r̲c̲h̲i̲v̲e̲(); if (zip->open(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(!is_dir(path)){
mkdir($path, 0777, true);
}
// 获取解压的文件数组
$fileNum = $zip->numFiles;

for ($i = 0; $i < $fileNum; $i++) {
    // 处理每一个文件
    $statInfo = $zip->statIndex($i, \ZipArchive::FL_ENC_RAW);
    // 获取文件的名称的编码格式
    $encoding = mb_detect_encoding($statInfo['name'], ['UTF-8','GBK','BIG5','CP936']);

    // 转换成UTF-8编码
    if (DIRECTORY_SEPARATOR == '/'){    //linux
        $filename = iconv($encoding, 'UTF-8', $statInfo['name']);
    }else{  //win
        $filename = iconv($encoding, 'UTF-8', $statInfo['name']);
    }

    if($statInfo['crc'] == 0) {
        //新建目录
        //mkdir($path.'/'.substr($filename, 0,-1));
        mkdir($path, 0777, true);
    } else {
        if(strpos($filename,'/') !== false){
           //获取文件名(看自己需求)
            $mkdFile = explode('/',$filename);
            if(count($mkdFile) == 1){
                $namePath = $mkdFile[0];
            }else{
                $namePath = $mkdFile[count($mkdFile)-1];
            }
          //获取zip单个文件数据
            $fp = fopen('zip://' . $filePath . '#' . $zip->getNameIndex($i), 'rb');
            while (!feof($fp)) {
                   //fread 获取文件数据流 保存到本地
                file_put_contents($path.DIRECTORY_SEPARATOR.$namePath, fread($fp,9999999));
            }
        }else{
            if(!copy('zip://' . $filePath . '#' . $zip->getNameIndex($i), $path . '/' . $filename)){
                return false;
            }
        }
    }
}
$zip->close();
return true;

} else {
return false;
}

四、总结

以上亲测有效,根据自己逻辑进行调整

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰姆小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值