将文件夹压缩成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邮件发送,php发送邮件的类
Mar 24 PHP
php学习笔记 面向对象的构造与析构方法
Jun 13 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
将php数组输出html表格的方法
Feb 24 PHP
PHP操作文件的一些基本函数使用示例
Nov 18 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
php银联网页支付实现方法
Mar 04 PHP
php生成图片缩略图的方法
Apr 07 PHP
php文件下载处理方法分析
Apr 22 PHP
php表单文件iframe异步上传实例讲解
Jul 26 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
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
canvas知识总结
2017/01/25 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
vue接口请求加密实例
2020/08/11 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Python3中的json模块使用详解
2018/05/05 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
求职简历自荐信范文
2013/10/21 职场文书
学前教育毕业生自荐信
2013/10/29 职场文书
爱情检讨书大全
2014/01/21 职场文书
《凡卡》教学反思
2014/04/09 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL