PHP 使用 ZipArchive 解压避免乱码

$filePath: 压缩包路径  ../123.zip
$path:要解压的目录 ../unzip/

public function newUnzip($filePath,$path)
    {
        $zip= new \ZipArchive();
        if($zip->open($filePath) === true) {
            // 创建要解压的目录
            // 获取解压的文件数组
            $fileNum = $zip->numFiles;
            for ($i = 0; $i < $fileNum; $i++) {
                // 处理每一个文件
                $statInfo = $zip->statIndex($i, 64);
                // 获取文件的名称的编码格式
                $info = explode('/', $statInfo['name']);
                foreach ($info as $key => $val) {
                    $encoding = mb_detect_encoding($val, ['UTF-8', 'GBK', 'BIG5', 'CP936']);
                    $info[$key] = iconv($encoding, 'UTF-8//IGNORE', $val);
                }
                $statInfo['name'] = implode('/', $info);
                mkdir($path, 0777, true);
                if (strpos($statInfo['name'], '/') !== false) {
                    $mkdFile = explode('/', $statInfo['name']);
                    if (count($mkdFile) == 1) {
                        $namePath = $mkdFile[0];
                    } else {
                        $namePath = $mkdFile[count($mkdFile) - 1];
                    }
                    //获取zip单个文件数据
                    $fp = fopen('zip://' . $filePath . '#' . $zip->getNameIndex($i), 'rb');
                    $create = true;
                    while (!feof($fp)) {
                        //fread 获取文件数据流 保存到本地
                        file_put_contents($path . DIRECTORY_SEPARATOR . $namePath, fread($fp, 9999999),$create ? 0 : FILE_APPEND);
                        $create = false;
                    }
                } else {
                    if (!copy('zip://' . $filePath . '#' . $zip->getNameIndex($i), $path . '/' . $statInfo['name'])) {
                        return false;
                    }
                }
            }
        }
        $zip->close();
    }
  

  

posted @ 2024-05-31 11:52  TOPHP  阅读(18)  评论(0编辑  收藏  举报