PHP ZipArchive 解压Zip文件

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压.

这里记录一下自己在项目中用到它来解压缩,然后读取里面的文件。

$zip = new ZipArchive;//新建一个ZipArchive的对象
$pic_dir = '/'; // 文件所在的绝对路径
if ($zip->open($zip_name) === TRUE)
{
    $file_arr = array();
    // 压缩包里面有多个文件的情况
    for($i=0; $i<$zip->numFiles; $i++){
        // 解压后的文件夹名称
        $file_name = pathinfo($zip->getNameIndex($i))['basename'];
        // 文件全路径
        $file_path = $pic_dir . pathinfo($zip->getNameIndex(0))['basename'];
        
        file_arr[] = $file_path;
        
        // 文件夹名称不支持中文名称
        if(preg_match('/[^x00-x80]/', $file_name)){
            continue;
        }
    }
    
    // 解压缩到某个位置
    $zip->extractTo($pic_dir);
    
    // 关闭
    $zip->close();
}

// 解压缩后就可以逐个读取文件夹里面的文件
$files = scandir($file_arr[0])

 ===========================================================

 后续发现的问题 文件夹中的文件名称如果包含某些中文或者字符, $zip->extractTo 会解压失败,报错 file open failed...... 这些,就是打开不了文件。

太懒了,这里先简单记录一下自己的解决过程:

1,先对文件名   urlencode(base64_encode($filename))   ;然后重命名压缩包里的文件 $zip->renameName($filename, $newfilename); ,这样就可以对中文那些压缩了

2,通过解压后,记得把文件名称还原回去,不然都是序列后的乱码,自己也找不到文件名称, base64_decode(urldecode($filename)) ;

 Tips: Windows环境下测试要转成gbk, 因为默认windows默认gbk,  $filename = mb_convert_encoding($imgs[$filename], 'gbk', 'utf-8');