当前位置: 首页 > 后端技术 > PHP

PHP实现下载压缩文件的打包整理

时间:2023-03-29 16:40:21 PHP

1.PHP实现打包zip并下载的功能$file_template=FCPATH.'canddata/cand_picture.zip';//在此之前,你必须在你的文件中创建一个空的项目目录zip包(必须存在)$downname=$card.'.zip';//你要打包的zip文件名$file_name=FCPATH.'canddata/'.$card.'.zip';//打包后你存放zip的目录$result=copy($file_template,$file_name);//将原项目目录下存在的zip复制一份新的副本到另一个目录并重命名(可以是intheoriginaldirectory)$zip=newZipArchive();//创建一个新对象if($zip->open($file_name,ZipArchive::CREATE)===TRUE){//打开你复制的空压缩包  $zip->addEmptyDir($card);//在zip压缩包中创建一个空文件夹,成功则返回TRUE,失败则返回FALSE  //下面是我的场景业务处理,可以处理根据自己的场景需要ssed(我的是把所有图片都打包)  $i=1;  foreach($cand_photoas$key3=>$value3){    $file_ext=explode('.',$value3['cand_face']);//得到图片的后缀    $zip->addFromString($card.'/'.$card.'_'.$i.'.'.$file_ext[3],file_get_contents($value3['cand_face']));//(重命名图片,得到图片的二进制流)    $i++;  }  $zip->close();  $fp=fopen($file_name,"r");  $file_size=filesize($file_name);//获取文件的字节  //下载文件所需的header  Header("Content-type:application/octet-stream");  Header("Accept-Ranges:bytes");  Header("Accept-Length:".$file_size);  Header("Content-Disposition:attachment;filename=$downname");  $缓冲区=1024;//设置一次读取的字节数,每次读取时输出数据(即返回给浏览器)  $file_count=0;//读取的总字节数  //返回数据给浏览器。如果下载完成,输出将停止。如果下载没有完成,会继续输出。根据文件字节大小判断是否下载完成  while(!feof($fp)&&$file_count<$file_size){$file_con=fread($fp,$buffer);$file_count+=$缓冲区;回声$file_con;}  fclose($fp);  //下载后删除压缩包,临时文件夹  if($file_count>=$file_size){    unlink($file_name);  }}二、PHP实现大文件下载这种方法是实现大文件下载,即使是几千兆也可以实现本地下载。可以测试一下,或者等你完善...functiondownloadFile($filename){//获取文件的扩展名$allowDownExt=array('rar','zip','png','txt','mp4','html');//获取文件信息$fileext=pathinfo($filename);//检查文件类型是否允许下载if(!in_array($fileext['extension'],$allowDownExt)){returnfalse;}//设置脚本的最大执行时间,如果设置为0则没有时间限制set_time_limit(0);ini_set('max_execution_time','0');//通过header()发送头部信息//因为不知道文件是什么类型的,所以告诉浏览器输出字节流header('content-type:application/octet-stream');//告诉浏览器返回文件大小类型作为字节头('Accept-Ranges:bytes');//获取文件大小//$filesize=filesize($filename);//(此方法无法获取远程文件大小)$header_array=get_headers($filename,true);$filesize=$header_array['Content-Length'];//告诉浏览器返回文件大小header('Accept-Length:'.$filesize);//告诉浏览器将文件作为附件处理并设置最终下载的文件名header('content-disposition:attachment;filename='.basename($filename));//对于大文件,每次读取的字节数为4096字节,直接输出数据$read_buffer=4096;$handle=fopen($文件名,'rb');//缓冲字节总数$sum_buffer=0;//只要没有到文件末尾,就继续读while(!feof($handle)&&$sum_buffer<$filesize){echofread($handle,$read_buffer);$sum_buffer+=$read_buffer;}//关闭句柄fclose($handle);exit;}三、PHP扩展类ZipArchive实现压缩Zip文件和文件包下载。这是一个封装了方法的类,也可以用试试看!file_path=$path;//待打包的根目录}/***入口调用函数*@return[type][以二进制流形式返回浏览器下载到本地]*/publicfunctionindex(){$zip=new压缩存档();$end_dir=$this->file_path.date('Ymd',time()).'.zip';//定义打包$dir=$this->file_path;如果(!is_dir($dir)){mkdir($dir);}if($zip->open($end_dir,ZipArchive::OVERWRITE)===TRUE){///ZipArchive::OVERWRITE如果文件存在则覆盖$this->addFileToZip($dir,$zip);//调用方法,对待打包的根目录进行操作,将ZipArchive对象传递给方法$zip->close();}if(!file_exists($end_dir)){exit("找不到文件");}header("缓存控制:public");header("内容描述:文件传输");header("Content-Type:application/zip");//zip格式标题('Content-disposition:attachment;filename='.basename($end_dir));//文件名头("Content-Transfer-Encoding:binary");//告诉浏览器这是一个二进制文件header('Content-Length:'.filesize($end_dir));//告诉浏览器,文件大小@readfile($end_dir);$this->delDirAndFile($dir,true);//删除目录和文件unlink($end_dir);////删除压缩包}/***文件压缩功能需要开启phpzip扩展*@param[string]$path[path]*@param[object]$zip[扩展ZipArchive类对象]*/protectedfunctionaddFileToZip($path,$zip){$handler=opendir($path);while(($filename=readdir($handler))!==false){if($filename!=“。”&&$filename!=".."){if(!is_dir($filename)){$zip->addFile($path."/".$filename,$filename);//第二个参数避免打包目录,可以不加}}}@closedir($path);}/***删除文件函数*@param[string]$dir[文件目录]*@paramboolean$delDir[是否删除目录]*@return[类型][描述]*/protectedfunctiondelDirAndFile($path,$delDir=true){$handle=opendir($path);if($handle){while(false!==($item=readdir($handle))){if($item!="."&&$item!=".."){if(is_dir($path.'/'.$item)){$this->delDirAndFile($path.'/'.$item,$delDir);}else{unlink($path.'/'.$item);}}}@closedir($handle);如果($delDir){returnrmdir($path);}}else{如果(file_exists($路径)){返回取消链接($路径);}else{返回假;}}}}