PHP执行zip与rar解压缩方法实现代码


Posted in PHP onDecember 05, 2010

Zip:PclZip http://www.phpconcept.net/pclzip/index.en.php
Rar:PECL rar http://pecl.php.net/package/rar
以往过去要在php下执行解压缩程序,无非最常见的方法是写command 然后用exec()等执行函式去跑
这在Windows下或许可以,但换成Unix话会碍于帐号权限问题而无法顺利执行
那有没有那种本身就有提供函式可以直接使用而不需要去下command去跑的方法呢
答桉有(话说找了好几天才找到可以用的方法......XD)
先讲Zip,由于php内建本身就有提供zip相关函式(但须先要有ziplib函式)但不是很好用
就光extract来讲,内建函式只负责单纯解压缩档桉出来,而不是会按照资料夹依序解压缩出来
这样就失去extract的作用
而要讲的 PclZip 这支,本身就有提供 extension 了,故有没有Ziplib就没差
且免安装,只需要再用他时 include 进来就可以了
例如:<?php include('pclzip.lib.php'); ?> 这样
此外在extract部分,则是会按照资料夹顺序依序解压缩出来,而并非单纯解压缩档桉出来
相关用法像这样

<?php 
require_once('pclzip.lib.php'); 
$archive = new PclZip('archive.zip'); 
if ($archive->extract() == 0) { /*解压缩路径跟原始档相同路径*/ 
die("Error : ".$archive->errorInfo(true)); 
} 
?>

当然也可以指定解压缩路径,像这样
<?php 
include('pclzip.lib.php'); 
$archive = new PclZip('archive.zip'); 
if ($archive->extract(PCLZIP_OPT_PATH, 'data') { /*data换成其他路径即可*/ 
die("Error : ".$archive->errorInfo(true)); 
} 
?>

如果再写一支自动建立目录的script会更好,因为函式本身不会判断压缩档?第一层是档桉还是资料夹(这我想其他相关函式也做不到吧!!!)
再来是Rar,这问题比较大,由于php本身没提供rar相关函式,所以需要求助第三方函式来用
所幸有这个 PECL(The PHP Extension Community Library)
?面有个 rar 的 package 可以使用
不过须得手动安装才行
若是 Unix 话,可以参考下列安装法

fetch http://pecl.php.net/get/rar-x.x.x.tgz
gunzip rar-xxx.tgz
tar -xvf rar-xxx.tar
cd rar-xxx
phpize
./configure && make && make install

当然若是 freebsd 话,用 port 装会更快

cd /usr/ports/archivers/pecl-rar
make
make install

记得安装完后须 restart apache
安装完后可以做测试

<?php 
$rar_file = rar_open('example.rar') or die("Failed to open Rar archive"); 
/*example.rar换成其他档桉即可*/ 
$entries_list = rar_list($rar_file); 
print_r($entries_list); 
?>

比较要注意的,若是用 port 安装话,版本会比较新(官网只有到0.3.1,port 安装话已经到0.3.4),所以用法上会有些出入
但extract用法上并无差异
相关用法像这样
<?php 
$rar_file = rar_open('example.rar') or die("Can't open Rar archive"); 
/*example.rar换成其他档桉即可*/ 
$entries = rar_list($rar_file); 
foreach ($entries as $entry) { 
$entry->extract('/dir/extract/to/'); /*/dir/extract/to/换成其他路径即可*/ 
} 
rar_close($rar_file); 
?>

跟Zip部分一样,若搭配自动建立目录会更好
PHP 相关文章推荐
PHP操作xml代码
Jun 17 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
Mar 23 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
thinkphp文件引用与分支结构用法实例
Nov 26 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 #PHP
php 学习资料零碎东西
Dec 04 #PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 #PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 #PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 #PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 #PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 #PHP
You might like
php限制ip地址范围的方法
2015/03/31 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
珍珠奶茶店创业计划书
2014/01/11 职场文书
机关财务管理制度
2014/01/17 职场文书
关于母亲节的感言
2014/02/04 职场文书
网络管理员岗位职责
2014/03/17 职场文书
出国留学计划书
2014/04/27 职场文书
金融管理专业求职信
2014/07/10 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
员工年终考核评语
2014/12/31 职场文书
2015年党建工作总结
2015/03/30 职场文书
停电调休通知
2015/04/16 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书