php 解壓縮zip 使用pclzip
php 2008 十二月 21st前幾天為了要讓人上傳壓縮檔所以咕狗了一下
然後就找到了這個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));
}
就我剛剛的研究,目前還不行建立有密碼的壓縮檔
不過還是很夠用了~ 推~