将文件夹压缩成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版)
Oct 09 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
Apr 13 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
PHP中Http协议post请求参数
Nov 02 PHP
如何用PHP做到页面注册审核
Mar 02 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
多文件上载系统完整版
2006/10/09 PHP
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
google地图的路线实现代码
2009/08/20 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
简单说明Python中的装饰器的用法
2015/04/24 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
简历的自我评价范文
2014/02/04 职场文书
三年级评语大全
2014/04/23 职场文书
三严三实对照检查材料
2014/09/22 职场文书
2014年消防工作总结
2014/11/21 职场文书
学习保证书
2015/01/17 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
Java Socket实现多人聊天系统
2021/07/15 Java/Android
详解Vue的列表渲染
2021/11/20 Vue.js
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang