PHP实现图片批量打包下载功能
上次遇到一个需要打包下载批量图片的问题,找了一下发现这个好方法,记录一下。
首先新建一个zipfile打包类:
<?php classzipfile{ var$datasec=array(); var$ctrl_dir=array(); var$eof_ctrl_dir="\x50\x4b\x05\x06\x00\x00\x00\x00"; var$old_offset=0; functionunix2_dostime($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; } return(($timearray['year']-1980)<<25)|($timearray['mon']<<21)|($timearray['mday']<<16)|($timearray['hours']<<11)|($timearray['minutes']<<5)|($timearray['seconds']>>1); } functionadd_file($data,$name,$time=0){ $name=str_replace('\\','/',$name); $dtime=dechex($this->unix2_dostime($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"; $fr.="\x00\x00"; $fr.="\x08\x00"; $fr.=$hexdtime; $unc_len=strlen($data); $crc=crc32($data); $zdata=gzcompress($data); $zdata=substr(substr($zdata,0,strlen($zdata)-4),2); $c_len=strlen($zdata); $fr.=pack('V',$crc); $fr.=pack('V',$c_len); $fr.=pack('V',$unc_len); $fr.=pack('v',strlen($name)); $fr.=pack('v',0); $fr.=$name; $fr.=$zdata; $fr.=pack('V',$crc); $fr.=pack('V',$c_len); $fr.=pack('V',$unc_len); $this->datasec[]=$fr; $cdrec="\x50\x4b\x01\x02"; $cdrec.="\x00\x00"; $cdrec.="\x14\x00"; $cdrec.="\x00\x00"; $cdrec.="\x08\x00"; $cdrec.=$hexdtime; $cdrec.=pack('V',$crc); $cdrec.=pack('V',$c_len); $cdrec.=pack('V',$unc_len); $cdrec.=pack('v',strlen($name)); $cdrec.=pack('v',0); $cdrec.=pack('v',0); $cdrec.=pack('v',0); $cdrec.=pack('v',0); $cdrec.=pack('V',32); $cdrec.=pack('V',$this->old_offset); $this->old_offset+=strlen($fr); $cdrec.=$name; $this->ctrl_dir[]=$cdrec; } functionadd_path($path,$l=0){ $d=@opendir($path); $l=$l>0?$l:strlen($path)+1; while($v=@readdir($d)){ if($v=='.'||$v=='..'){ continue; } $v=$path.'/'.$v; if(is_dir($v)){ $this->add_path($v,$l); }else{ $this->add_file(file_get_contents($v),substr($v,$l)); } } } functionfile(){ $data=implode('',$this->datasec); $ctrldir=implode('',$this->ctrl_dir); return$data.$ctrldir.$this->eof_ctrl_dir.pack('v',sizeof($this->ctrl_dir)).pack('v',sizeof($this->ctrl_dir)).pack('V',strlen($ctrldir)).pack('V',strlen($data))."\x00\x00"; } functionadd_files($files){ foreach($filesas$file){ if(is_file($file)){ $data=implode("",file($file)); $this->add_file($data,$file); } } } functionoutput($file){ $fp=fopen($file,"w"); fwrite($fp,$this->file()); fclose($fp); } } //下面是实例操作过程: $dfile=tempnam('/tmp','tmp');//产生一个临时文件,用于缓存下载文件 $zip=newzipfile(); //---------------------- $filename='image.zip';//下载的默认文件名 //以下是需要下载的图片数组信息,将需要下载的图片信息转化为类似即可 $image=array( array('image_src'=>'pic1.jpg','image_name'=>'图片1.jpg'), array('image_src'=>'pic2.jpg','image_name'=>'pic/图片2.jpg'), ); foreach($imageas$v){ $zip->add_file(file_get_contents($v['image_src']),$v['image_name']); //添加打包的图片,第一个参数是图片内容,第二个参数是压缩包里面的显示的名称,可包含路径 //或是想打包整个目录用$zip->add_path($image_path); } //---------------------- $zip->output($dfile); //下载文件 ob_clean(); header('Pragma:public'); header('Last-Modified:'.gmdate('D,dMYH:i:s').'GMT'); header('Cache-Control:no-store,no-cache,must-revalidate'); header('Cache-Control:pre-check=0,post-check=0,max-age=0'); header('Content-Transfer-Encoding:binary'); header('Content-Encoding:none'); header('Content-type:multipart/form-data'); header('Content-Disposition:attachment;filename="'.$filename.'"');//设置下载的默认文件名 header('Content-length:'.filesize($dfile)); $fp=fopen($dfile,'r'); while(connection_status()==0&&$buf=@fread($fp,8192)){ echo$buf; } fclose($fp); @unlink($dfile); @flush(); @ob_flush(); exit(); ?>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。