将文件夹压缩成zip文件的php代码


Posted in PHP onDecember 14, 2009

1.请先下载我准备好的zip.php工具类,下载后解压,将里面的文件放入对应的目录中,我是放在虚拟目录下的include文件夹中。
2.在你的php文件中加入下面代码即可

require_once "./include/zip.php"; 
$zip = new PHPZip(); 
//$zip -> createZip("要压缩的文件夹目录地址", "压缩后的文件名.zip"); //只生成不自动下载 
$zip -> downloadZip("要压缩的文件夹目录地址", "压缩后的文件名.zip");
//自动下载

实例:可以参考下面的伪代码来看一个具体的使用场景:
代码
require_once "./include/zip.php"; 
if (!$download) { 
exit(); 
} 
set_time_limit(60); 
$tmpManager = new TmpManager(); //假设我们有一个类来完成后面的操作 
$tempfolder = array(); 
$tempfile = array(); 
//假设我们是通过在页面上选择checkbox来下载已选的文件夹或文件,并一同打包 
for($i = 0;$i < $checkboxnum;$i++) { 
$value = ${"select".$i}; 
if ($value != '') { 
$this_type = substr($value, 0, 1); 
$this_id = substr($value, 1); 
//将文件夹和文件的情况分开处理 
if ($this_type == 'd') { 
$tempfolder[] = $this_id; 
} 
elseif ($this_type == 'f') { 
$tempfile[] = $this_id; 
} 
} 
} 
@mkdir($tempdir); 
$curtempdir = "$tempdir/".$userid; //不同用户在不同的临时文件夹下操作 
if (file_exists($curtempdir)) { 
$tmpManager->DeleteDir($curtempdir); //删除旧的文件夹 
} 
if (sizeof($tempfolder) > 0 || sizeof($tempfile) > 0) { 
mkdir($curtempdir, 0777); //如果有要打包的文件货文件夹,重新创建文件夹 
} 
if (sizeof($tempfile) > 0) { 
$tmpManager->CopyFile($tempfile,$curtempdir); //将要下载的文件copy到创建的文件夹 
} 
if (sizeof($tempfolder) > 0) { 
$tmpManager->CopyFolder($tempfolder,$curtempdir); //将要下载的文件夹copy到创建的文件夹 
} 
$zip = new PHPZip(); 
$zip -> downloadZip($curtempdir, "file_".date('Ymd').".zip"); //打包并下载

zip.php
<?php 
/* 
    File name: /include/zip.php 
    Author:    Horace 2009/04/15 
*/ 
class PHPZip{ 
    var $dirInfo = array("0","0"); 
    var $rootDir = ''; 
    var $datasec = array(); 
    var $ctrl_dir = array(); 
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; 
    var $old_offset = 0;     function downloadZip(){ 
        createZip($dir, $zipfilename, true); 
    } 
    function createZip($dir, $zipfilename, $autoDownload = false){ 
        if (@function_exists('gzcompress')){ 
            @set_time_limit("0"); 
            if (is_array($dir)){ 
                $fd = fopen ($dir, "r"); 
                $fileValue = fread ($fd, filesize ($filename)); 
                fclose ($fd); 
                if (is_array($dir)) $filename = basename($dir); 
                $this -> addFile($fileValue, "$filename"); 
            }else{ 
                $this->dirTree($dir,$dir); 
            } 
            $zipfilenametemp = time().$zipfilename; 
            $out = $this -> filezip(); 
            $fp = fopen($zipfilenametemp, "w"); 
            fwrite($fp, $out, strlen($out)); 
            fclose($fp); 
            $filesize = filesize($zipfilenametemp); 
            if ($filesize < 104857600) { 
                if($autoDownload){ 
                    header("Content-type: application/octet-stream"); 
                    header("Content-disposition: attachment; filename=".$zipfilename); 
                } 
                echo $this -> filezip(); 
            }else{ 
                echo "create zip error!"; 
            } 
            unlink($zipfilenametemp); 
        } 
     } 
    //get dir tree.. 
    function dirTree($directory,$rootDir){ 
        global $_SERVER,$dirInfo,$rootDir; 
        $fileDir=$rootDir; 
        $myDir=dir($directory); 
        while($file=$myDir->read()){ 
            if(is_dir("$directory/$file") and $file!="." and $file!=".."){ 
                $dirInfo[0]++; 
                $rootDir ="$fileDir$file/"; 
                $this -> addFile('', "$rootDir"); 
                //go on n's folders 
                $this->dirTree("$directory/$file",$rootDir); 
            }else{ 
                if($file!="." and $file!=".."){ 
                    $dirInfo[1]++; 
                    //$fd = fopen ("$directory/$file", "r"); 
                    $fileValue = file_get_contents("$directory/$file"); 
                    //fclose ($fd); 
                    $this -> addFile($fileValue, "$fileDir$file"); 
                } 
            } 
        } 
        $myDir->close(); 
    } 
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; 
} // end if 
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"; // ver needed to extract 
$fr .= "\x00\x00"; // gen purpose bit flag 
$fr .= "\x08\x00"; // compression method 
$fr .= $hexdtime; // last mod time and date 
// "local file header" segment 
$unc_len = strlen($data); 
$crc = crc32($data); 
$zdata = gzcompress($data); 
$c_len = strlen($zdata); 
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug 
$fr .= pack('V', $crc); // crc32 
$fr .= pack('V', $c_len); // compressed filesize 
$fr .= pack('V', $unc_len); // uncompressed filesize 
$fr .= pack('v', strlen($name)); // length of filename 
$fr .= pack('v', 0); // extra field length 
$fr .= $name; 
// "file data" segment 
$fr .= $zdata; 
// "data descriptor" segment (optional but necessary if archive is not 
// served as file) 
$fr .= pack('V', $crc); // crc32 
$fr .= pack('V', $c_len); // compressed filesize 
$fr .= pack('V', $unc_len); // uncompressed filesize 
// add this entry to array 
$this -> datasec[] = $fr; 
$new_offset = strlen(implode('', $this->datasec)); 
// now add to central directory record 
$cdrec = "\x50\x4b\x01\x02"; 
$cdrec .= "\x00\x00"; // version made by 
$cdrec .= "\x14\x00"; // version needed to extract 
$cdrec .= "\x00\x00"; // gen purpose bit flag 
$cdrec .= "\x08\x00"; // compression method 
$cdrec .= $hexdtime; // last mod time & date 
$cdrec .= pack('V', $crc); // crc32 
$cdrec .= pack('V', $c_len); // compressed filesize 
$cdrec .= pack('V', $unc_len); // uncompressed filesize 
$cdrec .= pack('v', strlen($name) ); // length of filename 
$cdrec .= pack('v', 0 ); // extra field length 
$cdrec .= pack('v', 0 ); // file comment length 
$cdrec .= pack('v', 0 ); // disk number start 
$cdrec .= pack('v', 0 ); // internal file attributes 
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set 
$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header 
$this -> old_offset = $new_offset; 
$cdrec .= $name; 
// optional extra field, file comment goes here 
// save to central directory 
$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)) . // total # of entries "on this disk" 
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall 
pack('V', strlen($ctrldir)) . // size of central dir 
pack('V', strlen($data)) . // offset to start of central dir 
"\x00\x00"; // .zip file comment length 
} 
} 
?>

zip.php文件打包
PHP 相关文章推荐
PHP实现Socket服务器的代码
Apr 03 PHP
PHP 金额数字转换成英文
May 06 PHP
PHP文件上传类实例详解
Apr 08 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
Nov 16 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 PHP
php入门教程 精简版
Dec 13 #PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 #PHP
Php Mssql操作简单封装支持存储过程
Dec 11 #PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 #PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 #PHP
php smarty模版引擎中的缓存应用
Dec 11 #PHP
php5 图片验证码实现代码
Dec 11 #PHP
You might like
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
Python中的is和id用法分析
2015/01/26 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
Python中字符串List按照长度排序
2019/07/01 Python
python 实现识别图片上的数字
2019/07/30 Python
Python request操作步骤及代码实例
2020/04/13 Python
基于python检查矩阵计算结果
2020/05/21 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
骨干教师培训制度
2014/01/13 职场文书
装饰活动策划方案
2014/02/11 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
学雷锋日活动总结
2015/02/06 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
Redis分布式锁的7种实现
2022/04/01 Redis
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python