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