php用PclZip类压缩和解压文件(格式为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 />"; 
        } 
?></sizeof>

上例将会回传结果:
File 0 / [filename] = data/file1.txt
File 0 / [stored_filename] = data/file1.txt
File 0 / [size] = 53
File 0 / [compressed_size] = 36
File 0 / [mtime] = 1010440428
File 0 / [comment] =
File 0 / [folder] = 0
File 0 / [index] = 0
File 0 / [status] = ok

File 1 / [filename] = data/file2.txt
File 1 / [stored_filename] = data/file2.txt
File 1 / [size] = 54
File 1 / [compressed_size] = 53
File 1 / [mtime] = 1011197724
File 1 / [comment] =
File 1 / [folder] = 0
File 1 / [index] = 1
File 1 / [status] = ok

PclZip实例3、解压缩档案
extract([options list]) :解压缩PKZIP中的档案或目录。
[options list]可用的参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。这些参数能让使用者在解压缩的时候有更多的选项,譬如指定变更解压缩档案的路径、指定只解压缩某些档案或不解压缩某些档案或者是将档案解压缩成字串输出(可用于readme档)。

下例是一个简单的解压缩档案示例,将压缩档archive.zip内的档案解压缩至目前的目录:

 
 
< ?PHP 
        require_once('pclzip.lib.php'); 
        $archive = new PclZip('archive.zip'); 
  
  
        if ($archive->extract() == 0) { 
            die("Error : ".$archive->errorInfo(true)); 
        } 
?>

下例是进阶的解压缩档案使用,archive.zip中所有档案都解压缩于data/中,而特别指明在install/release中的所有档案也直接丢于data/中,而非data/install/ release:
 
 
< ?PHP 
        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官方地址:http://www.phpconcept.net/pclzip/index.php
PclZip手册地址:http://www.phpconcept.net/pclzip/man/en/index.php
PEAR类创建ZIP档案文件:http://www.ccvita.com/10.html
PclZip简介与使用:http://www.ccvita.com/59.html
PclZip:强大的PHP压缩与解压缩zip类http://www.ccvita.com/330.html

 

 

以下为一个简单的压缩全站进行备份的代码:

1<?php 
2require_once('pclzip.lib.php'); 
3$zip = new PclZip("archive.zip"); 
4$v_list = $zip->create($_SERVER['DOCUMENT_ROOT'] ,PCLZIP_OPT_REMOVE_PATH, 
5$_SERVER['DOCUMENT_ROOT']); 
6if($v_list == 0){ echo '异常:'.$z->errorInfo(true); } 
7else { echo '备份成功'; } 
8?>

其他使用方法:

01<?php 
02//解压缩到extract/folder/这个目录中       
03$list = $archive->extract(PCLZIP_OPT_PATH, "extract/folder/");       
04          
05//增加这个目录在压缩档中,完成以后压缩档里面会有backup这个目录,backup里面会有这两个档案       
06$list = $archive->create("file.txt,image.gif",PCLZIP_OPT_ADD_PATH, "backup");       
07          
08//去掉部份的路径,这里完成后会变成test/file.txt       
09$list = $archive->add("/usr/local/user/test/file.txt",PCLZIP_OPT_REMOVE_PATH,  
10"/usr/local/user");       
11          
12//把所有路径都去掉,这个压缩档建立完后,里面就只会有file.txt跟image.gif,不会有目录了       
13$list = $archive->create("data/file.txt images/image.gif",PCLZIP_OPT_REMOVE_ALL_PATH);       
14          
15//把解压缩出来的档案的CHMOD设成0777       
16$list = $archive->extract(PCLZIP_OPT_SET_CHMOD, 0777);       
17      
18//解压缩部份的档案,这个参数是使用档案名称判别       
19//引数可以用下面这样的阵列       
20$rule_list[0] = 'test/aaa.txt';       
21$rule_list[1] = 'test/ddd.txt';       
22//或是下面这样,一个字串中,用逗号分隔每个要解压缩的档案       
23$rule_list = "test/aaa.txt,test/ddd.txt";       
24$list = $archive->extract(PCLZIP_OPT_BY_NAME,$rule_list);       
25          
26//解压缩部份的档案,使用php的ereg()函式,档案名称有比对成功的都会被解压缩       
27$list = $archive->extract(PCLZIP_OPT_BY_EREG, "aa");       
28          
29//解压缩部份的档案,使用php的preg_match()函式,档案名称有比对成功的都会被解压缩       
30$list = $archive->extract(PCLZIP_OPT_BY_PREG, "/^bb/");       
31//上面这两个函式如果不懂的话,请先研究正规表示法(Regular Expression)       
32          
33//依照阵列中元素的索引解压缩,可是我不太懂index啥 = =a       
34$list = $archive->extract(PCLZIP_OPT_BY_INDEX, array('0-1','6-7'));       
35          
36//将一个档案内容解压缩成一个字串       
37$list = $archive->extract(PCLZIP_OPT_BY_NAME, "data/readme.txt"
38PCLZIP_OPT_EXTRACT_AS_STRING);       
39          
40//将一个档案内容解压缩完后直接输出(echo)       
41$list = $archive->extract(PCLZIP_OPT_BY_NAME, "data/readme.txt"
42PCLZIP_OPT_EXTRACT_IN_OUTPUT);       
43          
44//将一个档案加入一个压缩档中,但不会对此档案压缩       
45$list = $archive->add("data/file.txt", PCLZIP_OPT_NO_COMPRESSION);       
46          
47//对此压缩档增加一个注解,如果原本就有注解的话会被覆盖掉       
48$list = $archive->create("data", PCLZIP_OPT_COMMENT, "Add a comment");       
49          
50//对此压缩档增加一个注解,如果原本就有注解的话会接在后面       
51$list = $archive->add("data", PCLZIP_OPT_ADD_COMMENT, "Add a comment after  
52the existing one");       
53          
54//对此压缩档增加一个注解,如果原本就有注解的话会放在原本的注解前面       
55$list = $archive->add("data", PCLZIP_OPT_PREPEND_COMMENT, "Add a comment before  
56the existing one");      
57?>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仿秀达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值