日期:2014-05-17  浏览次数:20576 次

PclZip:强大的PHP压缩与解压缩zip类

PclZip介绍
PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip、PKZIP);且能对此类类档案进行处理,包括产生压缩档、列出压缩档的内容以及解压 缩档案等等。由于能够在伺服器端进行压缩与解压缩的动作,所以相当方便使用。
PclZip定义一个PclZip类别,其类别物件可视为一个ZIP档案,亦提供method来进行处理。

?

如何使用PclZip

?

1.基础
所有的功能都由pclzip.lib.php这个档案提供,PclZip library可于其首页(www.phpconcept.net/pclzip/index.en.php)下载。所有的PKZIP档案其实就是一个 PclZip的类别物件。当产生一个PclZip档案(ie, PclZip类别物件),就会先产生一个压缩档,且档名已经指定,但此压缩档的内容尚未存在:

<?PHP
         require_once('pclzip.lib.php');
         $archive = new PclZip("archive.zip");
?>

此物件提供了一些public method可用来处理此档案。

?

2.参数
每一个method有其各自可使用的参数,包括有必须与非必须的参数:

<?PHP
         require_once('pclzip.lib.php');
         $archive = new PclZip('archive.zip');
 
         $v_list = $archive->add('dev/file.txt',
         PCLZIP_OPT_REMOVE_PATH, 'dev');
?>

上例中的’dev/file.txt’就是必须参数;’PCLZIP_OPT_REMOVE_PATH’则为非必须参数。当然有些method也可以只包 含非必须的参数:

<?PHP
         $list = $archive->extract(PCLZIP_OPT_PATH, "folder",
                          PCLZIP_OPT_REMOVE_PATH, "data",
                                PCLZIP_CB_PRE_EXTRACT, "callback_pre_extract",);
?>
?

上例中原本压缩档内档案存放的路径为/data,不过你可以指定解压缩至/folder中。此外,在解压缩之前,会呼叫callback function(’callback_pre_extract()’),此function可让使用者在解压缩的过程中变更档案存放路径与档名,或是选 择某些档案不解压缩。
所有可用的非必要参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。

?

3.回传值
每个method所回传的值可能会不同,将会在每个method中说明。不过大部分的method回传0、error或是阵列。

?

4.错误处理
从版本1.3之后,错误处理已经整合至PclZip类别中,当一个method回传错误码,可以得知一些额外的讯息以方便错误处理:
* errorName():回传错误名称
* errorCode():回传错误码
* errorInfo():回传错误的描述

接下来会举几个例子来说明如何使用PclZip。

?

PclZip实例1、产生ZIP压缩档
PclZip($zipname):为PclZip constructor,$zipname为PKZIP压缩档的档名。
主要是产生一个PclZip物件,即一个PKZIP压缩档;但此时,只有压缩档产生出来,并做一些检查(例如是否有开启zlib extension…等),除此之外,并没有做其他动作。

create($filelist, [optional arguments list]):将参数$filelist指定的档案或目录(包含当中所有档案与子目录)加入上述所产生的压缩档中。
而非必要的参数则能够修改压缩档内的档案存放路径。
此method可用的参数可以参考网志(www.phpconcept.net/pclzip/man/en/index.php)。

下面的示例说明如何产生PKZIP压缩档(档名为archive.zip),并将file.txt、data/text.txt以及目录 folder(包含当中的档案与子目录)加入刚刚产生的archive.zip中:

用法一:

<?php
include_once ('pclzip.lib.php');
$archive = new PclZip ( 'archive.zip' );
$v_list = $archive->create ( 'file.txt,data/text.txt,folder' );
if ($v_list == 0) {
	die ( "Error : " . $archive->errorInfo ( true ) );
}
?>
?

用法二:

下面的示例说明基本上与上例一样产生archive.zip,但在将file.txt与text.txt压缩于其中时,将路径由data/改为 install/ ;因此,在archive.zip中这两个档案的路径会是install/file.txt与install/text.txt

<?php
include_once ('pclzip.lib.php');
$archive = new PclZip ( 'archive.zip' );
$v_list = $archive->create ( 'data/file.txt,data/text.txt', PCLZIP_OPT_REMOVE_PATH, 'data', PCLZIP_OPT_ADD_PATH, 'install' );
if ($v_list == 0) {
	die ( "Error : " . $archive->errorInfo ( true ) );
}
?>
?

PclZip实例2、列出压缩档内容

listContent( ) :列出压缩档中的内容,包括档案的属性与目录:

<?PHP
include_once ('pclzip.lib.php');
$zip = new PclZip ( "test.zip" );

if (($list = $zip->listContent ()) == 0) {
	die ( "Error : " . $zip->errorInfo ( true ) );
}

for($i = 0; $i < sizeof ( $list ); $i ++) {
	for(reset ( $list [$i] ); $key = key ( $list [$i] ); next ( $list [$i] )) {
		echo "File $i / [$key] = " . $list [$i] [$key] . "<br>";
	}
	echo "<br />";
}
?>

?

上例将会回传结果:
File 0 / [filen