PHP壓縮和解壓縮文件的三種方式

前言:平時在項目中,偶爾會遇到文件備份導入導出的需求,在此記錄使用PHP執行文件壓縮和解壓縮的三種方式**

目錄

1. 使用PHP擴展的ZipArchive類
2. 使用壓縮與解壓縮類PclZip.php
3. 使用PHP函數exec()執行Linux下的壓縮zip,解壓縮unzip命令


1. 使用PHP擴展的ZipArchive類

使用之前要將php.ini文件中的zlib.output_compression設置爲On
配置參考

  • 示例:
function addFileToZip($path, $current, $zip) {
        // 打開文件夾資源
        $handler = opendir($path);
        // 循環讀取文件夾內容
        while(($filename = readdir($handler)) !== false) {
            // 過濾掉Linux系統下的.和..文件夾
            if ($filename != '.' && $filename != '..') {
                // 文件指針當前位置指向的如果是文件夾,就遞歸壓縮
                if (is_dir($path.'/'.$filename)) {
                    addFileToZip($path.'/'.$filename, $filename, $zip);
                } else {
                    // 爲了在壓縮文件的同時也將文件夾壓縮,可以設置第二個參數爲文件夾/文件的形式,文件夾不存在自動創建壓縮文件夾
                    $zip->addFile($path.'/'.$filename, $current.'/'.$filename);
                }
            }
        }
        @closedir($handler);
    }
    $zipName = '生成壓縮文件的路徑';
// 如果壓縮文件不存在,就創建壓縮文件
        if (! is_file($zipName)) {
            $fp = fopen($zipName, 'w');
            fclose($fp);
        }
        $zip = new \ZipArchive();
        // OVERWRITE選項表示每次壓縮時都覆蓋原有內容,但是如果沒有那個壓縮文件的話就會報錯,所以事先要創建好壓縮文件
        // 也可以使用CREATE選項,此選項表示每次壓縮時都是追加,不是覆蓋,如果事先壓縮文件不存在會自動創建
        if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
      	$current = '你要壓縮的文件的主目錄';
            $compress->addFileToZip($path, $current, $zip);
            $zip->close();
        } else {
            exit('打開zip文件失敗!');
        }
?>

2. 使用壓縮與解壓縮類PclZip.php

PclZip library能夠壓縮與解壓縮Zip格式的壓縮檔(WinZip、PKZIP);且能對此類類檔案進行處理,包括產生壓縮檔、列出壓縮檔的內容以及解壓縮檔案等等。由於能夠在伺服器端進行壓縮與解壓縮的動作,所以相當方便使用。
PclZip定義一個PclZip類別,其類別物件可視爲一個ZIP檔案,亦提供method來進行處理。

  • 示例:
<?php
    // 加載類文件
    require_once('PclZip.php');

    // 初始化類
    $zip = new PclZip("archive.zip");
    $result = $zip->create($_SERVER['DOCUMENT_ROOT'],PCLZIP_OPT_REMOVE_PATH,$_SERVER['DOCUMENT_ROOT']);
    if($result == 0){
        echo '異常信息:'.$z->errorInfo(true);}
    else{
        echo '成功';
    }
?>
  • 其它使用方法
<?php

    // 解壓縮到extract/folder/這個目錄中      
    $result = $archive->extract(PCLZIP_OPT_PATH,"extract/folder/");      

    // 增加這個目錄在壓縮檔中,完成以後壓縮檔裏面會有backup這個目錄,backup裏面會有這兩個檔案      
    $result = $archive->create("file.txt,image.gif",PCLZIP_OPT_ADD_PATH,"backup");      

    // 去掉部份的路徑,這裏完成後會變成test/file.txt      
    $result = $archive->add("/usr/local/user/test/file.txt",PCLZIP_OPT_REMOVE_PATH,"/usr/local/user");      

    // 把所有路徑都去掉,這個壓縮檔建立完後,裏面就只會有file.txt跟image.gif,不會有目錄了      
    $result = $archive->create("data/file.txt images/image.gif",PCLZIP_OPT_REMOVE_ALL_PATH);      

    // 把解壓縮出來的檔案的CHMOD設成0777      
    $result = $archive->extract(PCLZIP_OPT_SET_CHMOD,0777);      

    // 解壓縮部份的檔案,這個參數是使用檔案名稱判別      
    // 引數可以用下面這樣的陣列      
    $list = array('test/abc.txt', 'test/efg.txt');   
    // 或是下面這樣,一個字串中,用逗號分隔每個要解壓縮的檔案      
    $list = "test/abc.txt,test/efg.txt";      
    $result = $archive->extract(PCLZIP_OPT_BY_NAME, $list);      

    //解壓縮部份的檔案,使用php的ereg()函式,檔案名稱有比對成功的都會被解壓縮      
    $result = $archive->extract(PCLZIP_OPT_BY_EREG,"aa");      

    // 解壓縮部份的檔案,使用php的preg_match()函式,檔案名稱有比對成功的都會被解壓縮      
    $result = $archive->extract(PCLZIP_OPT_BY_PREG,"/^bb/");          

    // 依照陣列中元素的索引解壓縮   
    $result = $archive->extract(PCLZIP_OPT_BY_INDEX,array('0-1','6-7'));      

    // 將一個檔案內容解壓縮成一個字串      
    $result = $archive->extract(PCLZIP_OPT_BY_NAME,"data/readme.txt",PCLZIP_OPT_EXTRACT_AS_STRING);      

    // 將一個檔案內容解壓縮完後直接輸出(echo)      
    $result = $archive->extract(PCLZIP_OPT_BY_NAME,"data/readme.txt",PCLZIP_OPT_EXTRACT_IN_OUTPUT);      

    // 將一個檔案加入一個壓縮檔中,但不會對此檔案壓縮      
    $result = $archive->add("data/file.txt", PCLZIP_OPT_NO_COMPRESSION);      

    // 對此壓縮檔增加一個註解,如果原本就有註解的話會被覆蓋掉      
    $result = $archive->create("data", PCLZIP_OPT_COMMENT,"Add a comment");      

    // 對此壓縮檔增加一個註解,如果原本就有註解的話會接在後面      
    $result = $archive->add("data", PCLZIP_OPT_ADD_COMMENT,"Add a comment after the existing one");      

    // 對此壓縮檔增加一個註解,如果原本就有註解的話會放在原本的註解前面      
    $result = $archive->add("data", PCLZIP_OPT_PREPEND_COMMENT,"Add a comment before the existing one");     
?>

3. PHP自帶函數exec()執行Linux下的壓縮zip,解壓縮unzip命令

exec — 執行一個外部程序 (PHP 4, PHP 5, PHP 7)

  • 語法:exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 18: …mmand [, array &̲output [, int &$return_var ]] ) : string

$command: 要執行的shell 命令
$output: shell命令的輸出填充此數組,每行輸出填充數組中的一個元素。 請注意,如果數組中已經包含了部分元素,exec() 函數會在數組末尾追加內容。如果你不想在數組末尾進行追加,請在傳入 exec() 函數之前 對數組使用 unset() 函數進行重置。
$return_var: 命令執行後的返回狀態,命令執行成功值是0。

當然也可以使用system()函數

  • 示例:
exec("zip -P $password $zipFile $fileList", $outputs, $rc);
//參數講解:
//	-P,加密壓縮,解壓的時候會詢問密碼
//	$password,文件壓縮自定義密碼
//  $zipFile,壓縮生成的文件路徑
//  $fileList,需要壓縮的文件路徑字符串,多個時逗號隔開
exec("zip -P $password -m $zipFile $addfile", $outputs, $rc);// -m,將$addfile文件加入$zipFile壓縮文件中
exec("zip -P $psw -d $zipFile $removeFile", $outputs, $rc);// -d,從壓縮文件$zipFile內刪除指定的文件$removeFile

exec("unzip -P $password -o $zipFile -d $unzipFilePath", $outputs, $rc);
//  -o,不必先詢問用戶,unzip執行後覆蓋原有文件
//  -d,指定解壓路徑

  • 常用參數:
    zip
-r 遞歸,將指定目錄下的所有文件和子目錄一併處理

-S 包含系統和隱藏文件

-y 直接保存符號連接,而非該連接所指向的文件

-X 不保存額外的文件屬性

-m 將文件壓縮並加入壓縮文件後,刪除源文件

-<壓縮級別> 1~9,數字越大,壓縮率越高

-F 嘗試修復已損壞的壓縮文件

-T 檢查備份文件內的每個文件是否正確無誤

-q 不顯示指令執行過程

-g 將文件壓縮後附加在既有的壓縮文件之後,而非另行建立新的壓縮文件

-u 更新壓縮包內文件

-f 更新壓縮包內文件。如果符合條件的文件沒有包含在壓縮包中,則壓縮後添加

-$ 保存第一個被壓縮文件所在磁盤的卷標

-j 只保存文件名稱及其內容

-D 壓縮文件內不建立目錄名稱

-i <表達式> 壓縮目錄時,只壓縮符合條件的文件

-x <表達式> 排除符合條件的文件

-n <文件名後綴> 排除指定文件名後綴的文件

-b <緩存路徑> 指定臨時文件目錄

-d <表達式> 從壓縮文件內刪除指定的文件

-t <日期時間> 把壓縮文件的日期設成指定的日期

-o 以壓縮文件內擁有最新更改時間的文件爲準,將壓縮文件的更改時間設成和該文件相同

-A 調整可執行的自動解壓縮文件

-c 替每個被壓縮的文件加上註釋

-z 替壓縮文件加上註釋

-k 使用MS-DOS兼容格式的文件名稱。

-l 壓縮文件時,把LF字符置換成LF+CR字符。

-ll 壓縮文件時,把LF+CR字符置換成LF字符。

unzip

-d <路徑> 指定解壓路徑

-n 解壓縮時不覆蓋原有文件

-f 覆蓋原有文件

-o 不經詢問,直接覆蓋原有文件

-u 覆蓋原有文件,並將壓縮文件中的其他文件解壓縮到目錄中

-l 顯示壓縮文件內所包含的文件

-t 檢查壓縮文件是否正確

-z 顯示壓縮包註釋

-Z unzip -Z等於執行zipinfo指令

-j 不處理壓縮文件中原有的目錄路徑

-C 壓縮文件中的文件名稱區分大小寫

-L 將壓縮文件中的全部文件名改爲小寫

-s 將文件名中的空格轉換下劃線

-X 解壓縮時保留文件原來的UID/GID

-q 執行時不顯示任何信息

-v 執行是時顯示詳細的信息

-c 將解壓縮的結果顯示到屏幕上,並對字符做適當的轉換

-p 與-c參數類似,會將解壓縮的結果顯示到屏幕上,但不會執行任何的轉換

-a 對文本文件進行必要的字符轉換

-b 不要對文本文件進行字符轉換

-x <表達式> 處理裏排除壓縮包中的指定文件

-M 將輸出結果送到more程序處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章