PHP 压缩文件夹的类代码


Posted in PHP onNovember 05, 2009
<?php 
/* 
$Id: PHPZip.php 
*/ 
class PHPZip { 
var $datasec = array(); 
var $ctrl_dir = array(); 
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; 
var $old_offset = 0; 
function Zip($dir, $zipfilename) { 
if (@function_exists('gzcompress')) { 
@set_time_limit("0"); 
$this->openFile($dir,$dir); 
$out = $this -> filezip(); 
$fp = fopen($zipfilename, "w"); 
fwrite($fp, $out, strlen($out)); 
fclose($fp); 
} 
} 
function openFile($path, $zipName) { 
$temp_path = $path; 
$temp_zip_path = $zipName; 
$zipDir = $zipName; 
if ($handle = @opendir($path)) { 
while (false !== ($file = readdir($handle))) { 
if($file !='.' and $file !='..'){ 
if(ereg('\.' , $file.@basename())) { 
$fd = fopen($path.'/'.$file, "r"); 
$fileValue = @fread ($fd, 1024000); 
fclose ($fd); 
$this -> addFile($fileValue, $zipName . '/' . $file); 
} else { 
$this ->openFile($path.'/'.$file, $zipName . '/' . $file); 
} 
} 
} 
$zipName = $temp_zip_path; 
$path = $temp_path; 
closedir($handle); 
} 
} 
function unix2DosTime($unixtime = 0) { 
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); 
if ($timearray['year'] < 1980) { 
$timearray['year'] = 1980; 
$timearray['mon'] = 1; 
$timearray['mday'] = 1; 
$timearray['hours'] = 0; 
$timearray['minutes'] = 0; 
$timearray['seconds'] = 0; 
} 
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | 
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); 
} 
function addFile($data, $name, $time = 0) { 
$name = str_replace('\\', '/', $name); 
$dtime = dechex($this->unix2DosTime($time)); 
$hexdtime = '\x' . $dtime[6] . $dtime[7] 
. '\x' . $dtime[4] . $dtime[5] 
. '\x' . $dtime[2] . $dtime[3] 
. '\x' . $dtime[0] . $dtime[1]; 
eval('$hexdtime = "' . $hexdtime . '";'); 
$fr = "\x50\x4b\x03\x04"; 
$fr .= "\x14\x00"; 
$fr .= "\x00\x00"; 
$fr .= "\x08\x00"; 
$fr .= $hexdtime; 
$unc_len = strlen($data); 
$crc = crc32($data); 
$zdata = gzcompress($data); 
$c_len = strlen($zdata); 
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); 
$fr .= pack('V', $crc); 
$fr .= pack('V', $c_len); 
$fr .= pack('V', $unc_len); 
$fr .= pack('v', strlen($name)); 
$fr .= pack('v', 0); 
$fr .= $name; 
$fr .= $zdata; 
$fr .= pack('V', $crc); 
$fr .= pack('V', $c_len); 
$fr .= pack('V', $unc_len); 
$this -> datasec[] = $fr; 
$new_offset = strlen(implode('', $this->datasec)); 
$cdrec = "\x50\x4b\x01\x02"; 
$cdrec .= "\x00\x00"; 
$cdrec .= "\x14\x00"; 
$cdrec .= "\x00\x00"; 
$cdrec .= "\x08\x00"; 
$cdrec .= $hexdtime; 
$cdrec .= pack('V', $crc); 
$cdrec .= pack('V', $c_len); 
$cdrec .= pack('V', $unc_len); 
$cdrec .= pack('v', strlen($name) ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('V', 32 ); 
$cdrec .= pack('V', $this -> old_offset ); 
$this -> old_offset = $new_offset; 
$cdrec .= $name; 
$this -> ctrl_dir[] = $cdrec; 
} 
function filezip() { 
$data = implode('', $this -> datasec); 
$ctrldir = implode('', $this -> ctrl_dir); 
return 
$data . 
$ctrldir . 
$this -> eof_ctrl_dir . 
pack('v', sizeof($this -> ctrl_dir)) . 
pack('v', sizeof($this -> ctrl_dir)) . 
pack('V', strlen($ctrldir)) . 
pack('V', strlen($data)) . 
"\x00\x00"; 
} 
} 
?>
PHP 相关文章推荐
一个php作的文本留言本的例子(四)
Oct 09 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
Jun 03 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
Jul 04 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
详解js异步文件加载器
Jan 24 PHP
php实现学生管理系统
Mar 21 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 #PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 #PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 #PHP
初学CAKEPHP 基础教程
Nov 02 #PHP
PHP+MySQL 制作简单的留言本
Nov 02 #PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 #PHP
php 调用远程url的六种方法小结
Nov 02 #PHP
You might like
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
numpy数组拼接简单示例
2017/12/15 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Python对象转换为json的方法步骤
2019/04/25 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
PyQt 如何创建自定义QWidget
2021/03/24 Python
吨的认识教学反思
2014/04/27 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
部队2014年终工作总结
2014/11/27 职场文书
初中学生操行评语
2014/12/26 职场文书
2015年教务工作总结
2015/05/23 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android