php 解壓zip/rar
阿新 • • 發佈:2019-01-24
剛開始學習php,在做php線上解壓壓縮包並讀取檔案的目錄結構的功能,記錄下遇到的問題
1. 剛開始以為可以直接讀取壓縮包的目錄結構(可能我還沒找到方法吧),浪費了好多時間
2. 後來把壓縮包解壓到指定的目錄中,在讀取指定目錄指定資料夾(壓縮包名)的目錄結構,之後刪除該檔案
3. 線上解壓zip可以使用php自帶的ZipAchive
文章連結:
使用上面方法可以解決解壓問題,但是也有個坑:
Windows的檔案系統是gbk編碼的,而PHP ZipArchive中的檔名是UTF-8編碼的。換句話說,當有中文字元時會出現亂碼
解決方法:
不要用自帶的ZipArchive::extractTo()方法去解壓ZipArchive文件,改用PHP的zip封裝協議解壓去解決ZipArchive亂碼。網上有說php7.1之後就解決了中文的問題,我還沒試過
<?php $zip = new \ZipArchive; $zipfile = "./test.zip"; $res = $zip->open($zipfile); $toDir = "./test"; if(!file_exists($toDir)) { mkdir($toDir); } $docnum = $zip->numFiles; for($i = 0; $i < $docnum; $i++) { $statInfo = $zip->statIndex($i); if($statInfo['crc'] == 0) { //新建目錄 mkdir($toDir.'/'.substr($statInfo['name'], 0,-1)); } else { //拷貝檔案 copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']); } } print_r(scandir($toDir)); 作者:Dorm_Script
4. 線上解壓rar檔案php不能直接使用,通過查文章發現需要使用php_rar.dll
文章說的很清楚,但是還是有幾個坑,我還是記錄下
1> 我的電腦是64位的,但是使用的wamp整合環境是32位的,選擇dll時候應該選擇的x86(32位)的才對
2> 文章中說選擇非執行緒安全的(NTS)的dll,而我使用一直顯示php_rar.dll未載入
查詢phpinfo 發現
Thread Safety | enabled |
3> 選擇的php版本要對應,使用高版本的dll和低版本的php我沒有測試不知道會不會出錯,
我使用的是php5.5.12,下載的是php_rar-3.0.2-5.5-ts-vc11-x86這個dll
4> wamp中的php.ini並不是php資料夾中的那個,而是在Apache資料夾中
5. 附上程式碼
/**
* 解壓zip檔案到指定目錄
* $filepath: 檔案路徑
* $extractTo: 解壓路徑
*/
function dr_unZip($filepath,$extractTo) {
$zip = new ZipArchive;
$res = $zip->open($filepath);
if ($res === TRUE) {
//解壓縮到$extractTo指定的資料夾
$zip->extractTo($extractTo);
$zip->close();
} else {
echo 'failed, code:' . $res;
}
}
/**
* 解壓rar檔案到指定目錄
* $filepath: 檔案路徑
* $extractTo: 解壓路徑
*/
function dr_unrar($filepath,$extractTo) {
$rar_file = rar_open($filepath) or die('could not open rar');
$list = rar_list($rar_file) or die('could not get list');
foreach($list as $file) {
$pattern = '/\".*\"/';
preg_match($pattern, $file, $matches, PREG_OFFSET_CAPTURE);
$pathStr=$matches[0][0];
$pathStr=str_replace("\"",'',$pathStr);
$entry = rar_entry_get($rar_file, $pathStr) or die('</br>entry not found');
$entry->extract($extractTo); // extract to the current dir
}
rar_close($rar_file);
}