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');