首页 > 语言 > PHP > 正文

PHP实现图片批量打包下载功能

2024-09-04 11:44:41
字体:
来源:转载
供稿:网友

上次遇到一个需要打包下载批量图片的问题,找了一下发现这个好方法,记录一下。

首先新建一个zipfile打包类:

  1. <?php 
  2. classzipfile { 
  3.   var$datasec=array(); 
  4.   var$ctrl_dir=array(); 
  5.   var$eof_ctrl_dir="/x50/x4b/x05/x06/x00/x00/x00/x00"
  6.   var$old_offset= 0; 
  7.    //Vevb.com 
  8.   functionunix2_dostime($unixtime= 0){ 
  9.     $timearray= ($unixtime== 0) ?getdate() :getdate($unixtime);    
  10.     if($timearray['year'] < 1980){ 
  11.       $timearray['year'] = 1980; 
  12.       $timearray['mon'] = 1; 
  13.       $timearray['mday'] = 1; 
  14.       $timearray['hours'] = 0; 
  15.       $timearray['minutes'] = 0; 
  16.       $timearray['seconds'] = 0; 
  17.     } 
  18.     return(($timearray['year']  - 1980) << 25) | ($timearray['mon'] << 21) |  ($timearray['mday'] << 16) | ($timearray['hours'] << 11) |  ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); 
  19.   } 
  20.   functionadd_file($data,$name,$time= 0){ 
  21.     $name=str_replace('//','/',$name); 
  22.       
  23.     $dtime=dechex($this->unix2_dostime($time)); 
  24.     $hexdtime='/x'.$dtime[6] .$dtime[7] .'/x'.$dtime[4] .$dtime[5] .'/x'.$dtime[2] .$dtime[3] .'/x'.$dtime[0] .$dtime[1]; 
  25.     eval('$hexdtime = "'.$hexdtime.'";'); 
  26.       
  27.     $fr="/x50/x4b/x03/x04"
  28.     $fr.="/x14/x00"
  29.     $fr.="/x00/x00"
  30.     $fr.="/x08/x00"
  31.     $fr.=$hexdtime
  32.       
  33.     $unc_len=strlen($data); 
  34.     $crc= crc32($data); 
  35.     $zdata= gzcompress($data); 
  36.     $zdata=<a href="/tags.php/substr/" target="_blank">substr</a>(substr($zdata, 0,strlen($zdata)- 4), 2); 
  37.     $c_len=strlen($zdata); 
  38.     $fr.= pack('V',$crc); 
  39.     $fr.= pack('V',$c_len); 
  40.     $fr.= pack('V',$unc_len); 
  41.     $fr.= pack('v',strlen($name)); 
  42.     $fr.= pack('v', 0); 
  43.     $fr.=$name
  44.       
  45.     $fr.=$zdata
  46.     $fr.= pack('V',$crc); 
  47.     $fr.= pack('V',$c_len); 
  48.     $fr.= pack('V',$unc_len); 
  49.       
  50.     $this->datasec [] =$fr
  51.       
  52.     $cdrec="/x50/x4b/x01/x02"
  53.     $cdrec.="/x00/x00"
  54.     $cdrec.="/x14/x00"
  55.     $cdrec.="/x00/x00"
  56.     $cdrec.="/x08/x00"
  57.     $cdrec.=$hexdtime
  58.     $cdrec.= pack('V',$crc); 
  59.     $cdrec.= pack('V',$c_len); 
  60.     $cdrec.= pack('V',$unc_len); 
  61.     $cdrec.= pack('v',strlen($name)); 
  62.     $cdrec.= pack('v', 0); 
  63.     $cdrec.= pack('v', 0); 
  64.     $cdrec.= pack('v', 0); 
  65.     $cdrec.= pack('v', 0); 
  66.     $cdrec.= pack('V', 32); 
  67.       
  68.     $cdrec.= pack('V',$this->old_offset); 
  69.     $this->old_offset +=strlen($fr); 
  70.       
  71.     $cdrec.=$name
  72.       
  73.     $this->ctrl_dir[] =$cdrec
  74.   } 
  75.   functionadd_path($path,$l= 0){ 
  76.     $d= @<a href="/tags.php/opendir/" target="_blank">opendir</a>($path); 
  77.     $l=$l> 0 ?$l:strlen($path) + 1; 
  78.     while($v= @readdir($d)){ 
  79.       if($v=='.'||$v=='..'){ 
  80.         continue
  81.       } 
  82.       $v=$path.'/'.$v
  83.       if(is_dir($v)){ 
  84.         $this->add_path($v,$l); 
  85.       }else
  86.         $this->add_file(file_get_contents($v),substr($v,$l)); 
  87.       } 
  88.     } 
  89.   } 
  90.   functionfile(){ 
  91.     $data= implode('',$this->datasec); 
  92.     $ctrldir= implode('',$this->ctrl_dir); 
  93.     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"
  94.   } 
  95.     
  96.   functionadd_files($files){ 
  97.     <a href="/tags.php/foreach/" target="_blank">foreach</a>($filesas$file){ 
  98.       if(is_file($file)){ 
  99.         $data= implode("", file($file)); 
  100.         $this->add_file($data,$file); 
  101.       } 
  102.     } 
  103.   } 
  104.   functionoutput($file){ 
  105.     $fp=<a href="/tags.php/fopen/" target="_blank">fopen</a>($file,"w"); 
  106.     fwrite($fp,$this->file ()); 
  107.     fclose($fp); 
  108.   } 
  109.   
  110. //下面是实例操作过程: 
  111. $dfile= tempnam('/tmp','tmp');//产生一个临时文件,用于缓存下载文件 
  112. $zip=newzipfile(); 
  113. //---------------------- 
  114. $filename='image.zip'//下载的默认文件名 
  115.   
  116. //以下是需要下载的图片数组信息,将需要下载的图片信息转化为类似即可 
  117. $image=array
  118.   array('image_src'=>'pic1.jpg','image_name'=>'图片1.jpg'), 
  119.   array('image_src'=>'pic2.jpg','image_name'=>'pic/图片2.jpg'), 
  120. ); 
  121.   
  122. foreach($imageas$v){ 
  123.   $zip->add_file(file_get_contents($v['image_src']),$v['image_name']); 
  124.   // 添加打包的图片,第一个参数是图片内容,第二个参数是压缩包里面的显示的名称, 可包含路径 
  125.   // 或是想打包整个目录 用 $zip->add_path($image_path); 
  126. //---------------------- 
  127. $zip->output($dfile); 
  128.   
  129. // 下载文件 
  130. ob_clean(); 
  131. header('Pragma: public'); 
  132. header('Last-Modified:'.gmdate('D, d M Y H:i:s') .'GMT'); 
  133. header('Cache-Control:no-store, no-cache, must-revalidate'); 
  134. header('Cache-Control:pre-check=0, post-check=0, max-age=0'); 
  135. header('Content-Transfer-Encoding:binary'); 
  136. header('Content-Encoding:none'); 
  137. header('Content-type:multipart/form-data'); 
  138. header('Content-Disposition:attachment; filename="'.$filename.'"');//设置下载的默认文件名 
  139. header('Content-length:'.filesize($dfile)); 
  140. $fp=fopen($dfile,'r'); 
  141. while(connection_status() == 0 &&$buf= @fread($fp, 8192)){ 
  142.   echo$buf
  143. fclose($fp); 
  144. @unlink($dfile); 
  145. @flush(); 
  146. @ob_flush(); 
  147. exit(); 
  148. ?>

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表