php 解壓縮zip 使用pclzip

2008-12-21

前幾天為了要讓人上傳壓縮檔所以咕狗了一下

然後就找到了這個pclZip,是一個class,所以很好使用,include檔案就可以用了。
其實他也可以壓縮檔案,只是我還用不到,所以下面講的都比較有關解壓縮。

這是最基本的用法:

  require_once('pclzip.lib.php');
  $archive = new PclZip('archive.zip');
  $archive->extract();

這樣就可以把archive.zip這個檔案解壓縮到當前目錄!傷當的簡單阿!
不過記得解壓縮到的目錄的權限要可以寫入,不然會卡住,我因為這個卡很久阿…很笨=..=

他每個method還可以加上許多的參數,可以讓壓縮檔更帥…(什麼鬼)
下面是我把官網上有寫的參數都翻一下,細節可以自己到這裡研究看看

參數 引數
說明
PCLZIP_OPT_PATH 字串
要解壓縮到哪的路徑。可用於extract()、extractByIndex()。
PCLZIP_OPT_ADD_PATH 字串
增加一個目錄。可用於create()、add()、extract()。(使用於create()時,是把要壓縮的檔案放進這個目錄中再壓縮,使用於extract()時,是在要解壓縮的路徑中增加此目錄,並解壓縮到此目錄中)。
PCLZIP_OPT_REMOVE_PATH 字串
移除部份的目錄路徑,例如原本檔案所在的目錄為aa/bb/cc/test.test.txt,但是希望壓縮或解壓縮後的路徑為cc/test.txt,就可以使用PCLZIP_OPT_REMOVE_PATH,”aa/bb”。可用於create()、add()、extract()、extractByIndex()。(與PCLZIP_OPT_REMOVE_ALL_PATH一起用的時候會被自動忽略)
PCLZIP_OPT_REMOVE_ALL_PATH --
移除所有檔案的目錄,所有檔案都會被解壓縮或壓縮到當前或是指定的目錄中,請注意如果有不同目錄的相同名稱檔案,使用此參數時會被覆蓋,此參數不需要引數。可用於create()、add()、extract()、extractByIndex()。
PCLZIP_OPT_SET_CHMOD CHMOD值
設定解壓縮出來的檔案的CHMOD值。可用於extract()、extractByIndex()。
PCLZIP_OPT_BY_NAME 檔案名稱
僅解壓縮引數中所指定的檔案,檔案名稱可以用陣列或是逗號隔開表示。
PCLZIP_OPT_BY_EREG RegEx字串
僅解壓縮引數中正規表達式比對檔名正確的檔案,使用php中的ereg()函式比對。
PCLZIP_OPT_BY_PREG RegEx字串
僅解壓縮引數中正規表達式比對檔名正確的檔案,使用php中的preg_match()函式比對。
PCLZIP_OPT_BY_INDEX 陣列
僅解壓縮引數陣列中各元素所指定順序的檔案。(這個我還不太懂是照什麼順序,似乎不是照字母排)
PCLZIP_OPT_EXTRACT_AS_STRING --
將一個檔案的內容解壓縮成一個字串,通常可能用於只需要看readme檔案的情況。請注意如果一次解壓縮太多檔案,有可能會將記憶體耗盡。
PCLZIP_OPT_EXTRACT_IN_OUTPUT --
將一個檔案的內容解壓縮並直接輸出(即類似直接echo此結果)。
PCLZIP_OPT_NO_COMPRESSION --
將一個檔案加入此壓縮檔內,此檔案不會被壓縮,僅是放入同一個壓縮檔中。
PCLZIP_OPT_COMMENT 字串
建立壓縮檔時增加一個註解,如果原本已經有註解的話,將會直接覆蓋過去。
PCLZIP_OPT_ADD_COMMENT 字串
建立壓縮檔時增加一個註解,如果原本已經有註解的話,將會接在後面。
PCLZIP_OPT_PREPEND_COMMENT 字串
建立壓縮檔時增加一個註解,如果原本已經有註解的話,將會把原先的註解接在此字串的後面。

下面這些是範例,其實就跟官網的user manual內容一樣:

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

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

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

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

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

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

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

//解壓縮部份的檔案,使用php的preg_match()函式,檔案名稱有比對成功的都會被解壓縮
$list = $archive->extract(PCLZIP_OPT_BY_PREG, "/^bb/");
//上面這兩個函式如果不懂的話,請先研究正規表示法(Regular Expression)

//依照陣列中元素的索引解壓縮,可是我不太懂index啥 = =a
$list = $archive->extract(PCLZIP_OPT_BY_INDEX, array('0-1','6-7'));

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

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

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

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

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

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

這個是官網中extract()的範例:

  include('pclzip.lib.php');
  $archive = new PclZip('archive.zip');
  if ($archive->extract(PCLZIP_OPT_PATH, 'data',
                        PCLZIP_OPT_REMOVE_PATH, 'install/release') == 0) {
    //當有錯誤的時候,可以用這個顯示錯誤訊息
    die("Error : ".$archive->errorInfo(true));
  }

就我剛剛的研究,目前還不行建立有密碼的壓縮檔
不過還是很夠用了~ 推~

參考資訊:
PclZip
PclZip 簡介與使用
TechWiki:PclZip

Posted by on 2008 年 12 月 21 日 in php, ,

發表迴響

彙整

分類