PHP生成压缩文件实例
大概需求:
每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载
细节需求:当前订单号_年月日+时间.zip 例如:
1.生成压缩文件,压缩文件名格式:
2.压缩文件存放在根目录/upload/zipfile/年月/自定义的压缩文件名.zip
3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载
4.为了防止暴露压缩包文件路径,需要对下载的压缩包文件名改名
具体操作模式请见下面的代码:
文件路径:
压缩包文件存放路径:/upload/zipfile/
上传的附件存放路径:/upload/file/
1.基本配置文件文件config.inc.php放在系统根目录
define('SYS_ROOT',str_replace("\\",'/',dirname(__FILE__))); define('SYS_UPLOAD',SYS_ROOT.'/upload/file'); define('SYS_DOWNLOAD',SYS_ROOT.'/upload/zipfile'); define('SYS_WIN',strpos(strtoupper(PHP_OS),'WIN')!==false?true:false); define('SYS_CHMOD',('0777'&&!SYS_WIN)?'0777':0);
2.压缩包程序代码文件getzip.php
header("Content-type:text/html;charset=utf-8"); require_once'../config.inc.php';//载入配置路径配置文件 $arrfiles=array(SYS_UPLOAD.'/1.jpg', SYS_UPLOAD.'/x.jpg',);//这里是附件的文件数组 $orderNum='888';//订单号 $downFileName='tieniu.zip';//下载的文件名如果为空那么就是系统自定义名称如果指定就显示指定名字 $zipUrl=create_zip($arrfiles,$orderNum);//生成的压缩文件名词 file_down($zipUrl,$downFileName);//提供http下载,并可以进行重命名下载文件,建议重命名,防止路径猜解 /* *生成压缩包文件名 *@param[String]$orderNum订单号 *@return[String]返回带有绝对路径的订单号的压缩文件名 */ functionget_zipname($orderNum){ $zipName=SYS_DOWNLOAD.'/'.date('Ym').'/'.$orderNum.'_'.date("Ymd_Hi").'.zip'; return$zipName; } /* *按照特定需求打包压缩包的目录结构设置 */ functionpack_object(){ } /* *生成压缩包 *@param[Array]$arrfiles带有绝对路径的文件数组 *@param[String]$orderNum订单号 *@return[String]返回带有绝对路径的订单号的压缩文件名如如果失败返回FALSE */ functioncreate_zip($arrfiles,$orderNum){ $zipName=get_zipname($orderNum);//获得文件名 dir_create(dirname($zipName));//建立生成压缩文件的目录 $zip=newZipArchive(); if($zip->open($zipName,ZIPARCHIVE::CREATE)!==TRUE){ returnFALSE; } foreach($arrfilesas$path){ if(is_file($path)){//判断文件是否存在 $zip->addFile($path,basename($path));//把文件加入到压缩包中 } } $zip->close(); return$zipName; } /* *处理文件目录 *@param[Array]$arrfiles带有绝对路径的文件数组 *@param[String]$dirpath文件路径 *@return[String]返回处理的文件路径,方便生成文件目录 */ functiondir_path($dirpath){ $dirpath=str_replace('\\','/',$dirpath); if(substr($dirpath,-1)!='/') $dirpath=$dirpath.'/'; return$dirpath; } /* *生成文件目录 *@param[String]$path文件路径 *@return[String]返回生成的文件目录结构 */ functiondir_create($path){ if(is_dir($path)) returntrue; $dir=str_replace(SYS_DOWNLOAD.'/','',$path); $dir=dir_path($dir); $temp=explode('/',$dir); $cur_dir=SYS_DOWNLOAD.'/'; $max=count($temp)-1; for($i=0;$i<$max;$i++){ $cur_dir.=$temp[$i].'/'; if(is_dir($cur_dir)) continue; @mkdir($cur_dir); if(SYS_CHMOD) @chmod($cur_dir,SYS_CHMOD); if(!is_file($cur_dir.'/index.html')&&!is_file($cur_dir.'/index.php')) file_copy(SYS_ROOT.'/upload/index.html',$cur_dir.'/index.html'); } returnis_dir($path); } /* *文件COPY *@param[String]$fromcopy源文件 *@param[String]$tocopy文件目的地 *@return[Bool]成功ture失败false */ functionfile_copy($from,$to){ dir_create(dirname($to)); if(is_file($to)&&SYS_CHMOD) @chmod($to,SYS_CHMOD); if(@copy($from,$to)){ if(SYS_CHMOD) @chmod($to,SYS_CHMOD); returntrue; }else{ returnfalse; } } /* *文件下载处理函数 *@param[String]$file文件路径 *@param[String]$filename下载时间重新命名的文件名 *@param[String]$data下载文件填装的数据内容 */ functionfile_down($file,$filename='',$data=''){ if(!$data&&!is_file($file)) exit; $filename=$filename?$filename:basename($file); $filetype=file_ext($filename); $filesize=$data?strlen($data):filesize($file); ob_end_clean(); @set_time_limit(0); if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')!==false){ header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); header('Pragma:public'); }else{ header('Pragma:no-cache'); } header('Expires:'.gmdate('D,dMYH:i:s').'GMT'); header('Content-Encoding:none'); header('Content-Length:'.$filesize); header('Content-Disposition:attachment;filename='.$filename); header('Content-Type:'.$filetype); if($data){ echo$data; }else{ readfile($file); } exit; } functionfile_ext($filename){ returnstrtolower(trim(substr(strrchr($filename,'.'),1))); } //此函数未用到,用来做整个目录的打包下载 functionlistdir($start_dir='.'){ $files=array(); if(is_dir($start_dir)){ $fh=opendir($start_dir); while(($file=readdir($fh))!==false){ if(strcmp($file,'.')==0||strcmp($file,'..')==0) continue; $filepath=$start_dir.'/'.$file; if(is_dir($filepath)) $files=array_merge($files,listdir($filepath)); else array_push($files,$filepath); } closedir($fh); }else{ $files=false; } return$files; }
3.PHP程序生成压缩文件需要用到压缩类:ZipArchive
这个是php的扩展类,自php5.2版本以后就已经支持这个扩展,如果你在使用的时候出现错误,查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。