php生成zip压缩文件的方法详解
2015-01-24信息快讯网
本篇文章是对php生成zip压缩文件的方法进行了详细的分析介绍,需要的朋友参考下
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 } } ?>
php实现执行某一操作时弹出确认、取消对话框
php上传图片到指定位置路径保存到数据库的具体实现
php-perl哈希算法实现(times33哈希算法)
php实现在线生成条形码示例分享(条形码生成器)
浅谈PHP变量作用域以及地址引用问题
php递归获取目录内文件(包含子目录)封装类分享
zend framework文件上传功能实例代码
php使用filter过滤器验证邮箱 ipv6地址 url验证
php jquery 多文件上传简单实例
php读取csv实现csv文件下载功能
php文件上传的例子及参数详解
PHP根据IP地址获取所在城市具体实现
php file_get_contents抓取Gzip网页乱码的三种解决方法
php ZipArchive压缩函数详解实例
PHP禁止个别IP访问网站
使用php判断服务器是否支持Gzip压缩功能
使用php判断网页是否gzip压缩
如何用php获取程序执行的时间
基于php iconv函数的使用详解
PHP页面间参数传递的四种方法详解
利用PHP+JS实现搜索自动提示(实例)
深入php处理整数函数的详解
解决ajax+php中文乱码的方法详解
PHP转换IP地址到真实地址的方法详解
探讨PHP删除文件夹的三种方法
如何用php获取文件名后缀
探讨如何在PHP开启gzip页面压缩实例
使用迭代器 遍历文件信息的详解
PHP stripos()函数及注意事项的分析
php遍历所有文件及文件夹的方法深入解析
解析PHP中如何将数组变量写入文件
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
php IP转换整形(ip2long)的详解
php gzip压缩输出的实现方法
php简单开启gzip压缩方法(zlib.output_compression)
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件