复制代码 代码如下:
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
}
}
?>
相关推荐:
SEO妍:搜索引擎优化的艺术,轻松打造网络营销新未来,辽宁网站建设贵不贵
ChatGPT进不去怎么办?解决方案与技巧,轻松畅享智能对话,ai va
ChatGPT出现错误503?你需要知道的解决方案和应对策略,ai拉伸字效
SEO关键词推广软件官网-助力企业实现高效精准的网络营销,圈圈ai
GPT在智能聊天机器人中的作用:重塑沟通体验,开创智能未来,百万级ai
seo简报什么意思,seo工作汇报 ,万花筒 ai
SEO北京:数字时代,企业成功的关键,湖南网站建设湖南岚鸿
为什么网站要做seo,网站做seo的目的是什么 ,ai初选
怎么查一篇文章是不是AI写的?你需要这几个关键方法!
在线AI文章生成:内容创作新革命
ChatGPT为什么访问不了了?了解背后的原因与解决方法,AI怎么拖入路径
SEO运营工作是什么,seo公司运营 ,720516AI
SEO武汉:如何提升武汉地区网站的搜索引擎排名,景区网站建设费用
SEO分类中内部优化的有:让你的网站脱颖而出!,by ai
优排软件:高效管理新天地,轻松提升工作效率,长葛外贸网站建设
seo运营经理是什么,seo和运营的区别 ,皖妍ai宁慕晴o
SEO韩国:为您开启国际市场的增长之门,seo文章标题有哪些
互联网资源的无限潜力:如何利用数字世界为个人和企业创造价值,信阳网站建设正规公司
AI搜索相似文章怎么做?揭秘高效文章检索的核心技术!,程式ai软件
怎么用AI润色文章,让你的文稿瞬间高大上
ChatGPT最近不好用了?了解这些背后的原因与解决方案,ai sketcher
SEO出超:如何通过精准优化实现网站流量大爆发,营销推广方式联系f火15星
SEO全站优化:打造强大网站排名的必备利器,AI论文写作的优点
SEO定价策略:如何根据企业需求定制最佳价格方案,教育培训抖音营销推广
SEO策划:让你的网站迅速脱颖而出的秘诀,seo优化和技巧
seo涉及什么内容,seo主要包括 ,法医使用ai
seo词库优化,搜索词条优化 ,ai点选择
优化收费,助力企业提升效益,实现共赢,宜州餐饮网站建设
亚马逊seo是什么公司的,“亚马逊” ,ai玩底特律
AI人工智能文章生成器写作新纪元
SEO特点与实施策略:提升网站流量与排名的关键,定西抖音seo价格查询
ZBlog:开启你的个人网站新时代,轻松搭建与管理,二手手机营销推广方案
WPJVX:开启数字化未来的智慧平台,关键词排名技术咨询乐云seo
ChatGPT崩溃!用户反馈网页端无法访问,修复急需,ai院子
SEO架构:提升网站流量的核心策略,东营南江全平台营销推广
SEO教研:数字营销新趋势,提升网站流量与转化率的关键,齐鲁证券网站建设
ChatGPT付款银行卡被拒绝?解决方案全解析!,小发猫ai智能写作查重能过吗
智能AI生成文章释放创作新可能
用AI生成文章,让创作更简单高效
文章写作AI:让创作更高效、精准的智能助手
求一个AI软件,彻底改变你的工作与生活!
ChatGDP人工智能:未来科技赋能企业与个人的智能变革,如何用AI绘制人体
SEO每日:提高网站流量的秘密武器,助你脱颖而出,seo优化和排名技巧
AI免费生成文章让创作变得轻松自如
专业SEO方案助力企业网站流量暴增,精准引流不再是难题,网站建设合同4篇
ChatGPT网站突然不能用了?如何快速解决这个问题,让你重新畅享AI对话!,ai新建多个画板
“曝光量扩大,助力品牌腾飞的秘密武器”,盐山网站优化免费咨询
SEO技术如何通过优化提升网站流量与排名,四平网站优化公司
撰写稿子的AI,写作的“超级助手”来了!
ChatGPTCanvex打不开?详细分析及解决方法助你顺利使用,ai2.5d网格线去除