1. 程式人生 > >php 解壓zip/rar

php 解壓zip/rar

剛開始學習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
因此應該選擇的是執行緒安全(TS)的dll,使用後果然沒再出錯

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