zoukankan      html  css  js  c++  java
  • php实现多张图片打包下载

    平时下载图片是单张图片,比较不高效。

    之前自己从网上考了一个试着玩,发现不行,下载的压缩包中的图片也是只有一张。也没有找到具体原因在哪里。然后现在是又找了一个,测试了也可以,分享给大家。

    <?php
    class zipfile {
      var $datasec = array ();
      var $ctrl_dir = array ();
      var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
      var $old_offset = 0;
       
      function unix2_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);
      }
      function add_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 = "x50x4bx03x04";
        $fr .= "x14x00";
        $fr .= "x00x00";
        $fr .= "x08x00";
        $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 = "x50x4bx01x02";
        $cdrec .= "x00x00";
        $cdrec .= "x14x00";
        $cdrec .= "x00x00";
        $cdrec .= "x08x00";
        $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;
      }
      function add_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));
          }
        }
      }
      function file(){
        $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)) . "x00x00";
      }
       
      function add_files($files){
        foreach($files as $file){
          if (is_file($file)){
            $data = implode("", file($file));
            $this->add_file($data, $file);
          }
        }
      }
      function output($file){
        $fp = fopen($file, "w");
        fwrite($fp, $this->file ());
        fclose($fp);
      }
    } 
     
    //下面是实例操作过程:
    $dfile = tempnam('/tmp', 'tmp');//产生一个临时文件,用于缓存下载文件
    $zip = new zipfile();
    //----------------------
    $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($image as $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, d M Y H: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();
    ?>

    参考: http://www.jb51.net/article/107107.htm

    下面的这个是没有成功的,但是也是可以用来下载别的文件的。都是学习嘛。

    /*php多文件压缩并且下载*/
    function addFileToZip($path,$zip){
            $handler=opendir($path); //打开当前文件夹由$path指定。
            while(($filename=readdir($handler))!==false){
                if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作
                    if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
                        addFileToZip($path."/".$filename, $zip);
                    }else{
                        //将文件加入zip对象;并减少目录层
                        $zip->addFile($path.$filename, $filename);
                    }
                }
            }
            @closedir($path);
        }
         
        //要下载的文件夹路径
        $filePath = '..'.$_GET['activepath']. '/'. $_GET['filename'].'/';
        //生成压缩文件名字
        $zipFileName = '../download/'.$_GET['filename'] .'.zip';
     
        $zip=new ZipArchive();
        if($zip->open($zipFileName, ZipArchive::OVERWRITE)=== TRUE){
            addFileToZip($filePath, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
            $zip->close(); //关闭处理的zip文件
        }
         
        if(!file_exists($zipFileName))
        {
            echo '文件压缩失败!或者未生成压缩包!!';
            exit;
        }
         
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header('Content-disposition: attachment; filename='.basename($zipFileName)); //文件名
        header("Content-Type: application/zip"); //zip格式的
        header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
        header('Content-Length: '. filesize($zipFileName)); //告诉浏览器,文件大小
        @readfile($zipFileName);

    参考: http://www.cnblogs.com/Abner3721/p/5777115.html

  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/-lin/p/7149315.html
Copyright © 2011-2022 走看看