加入收藏 | 设为首页 | 会员中心 | 我要投稿 梅州站长网 (https://www.0753zz.cn/)- 行业物联网、云备份、数据工具、云计算、智能推荐!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

一个PHP的ZIP压缩类分享

发布时间:2022-06-22 09:12:06 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了一个PHP的ZIP压缩类分享,需要的朋友可以参考下。 功能:将文件压缩成zip,或者rar的压缩包。后缀名可以自定义。 使用方法:首先实例化,然后传参。两个参数。第一个关于你文件地址的一个Array。第二个是要你要保存的压缩包文件的绝对地址
  这篇文章主要介绍了一个PHP的ZIP压缩类分享,需要的朋友可以参考下。
 
  功能:将文件压缩成zip,或者rar的压缩包。后缀名可以自定义。
 
  使用方法:首先实例化,然后传参。两个参数。第一个关于你文件地址的一个Array。第二个是要你要保存的压缩包文件的绝对地址。
 
  使用例子:
 
  $zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt");
  $z = new PHPZip();
  //$randomstr = random(8);
  $zipfile = TEMP."/photocome_".$groupid.".zip";
  $z->Zip($zipfiles, $zipfile); //添加文件列表
  PHP的ZIP压缩类如下:
 
  <?php
  #
  # PHPZip v1.2 by Sext (sext@neud.net) 2002-11-18
  #     (Changed: 2003-03-01)
  #
  # Makes zip archive
  #
  # Based on "Zip file creation class", uses zLib
  #
  #
  class PHPZip
  {
      function Zip($dir, $zipfilename)
      {
          if (@function_exists('gzcompress'))
          {     
              $curdir = getcwd();
              if (is_array($dir))
              {
                      $filelist = $dir;
              }
              else
              {
                  $filelist = $this -> GetFileList($dir);
              }
   
              if ((!emptyempty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
              else chdir($curdir);
   
              if (count($filelist)>0)
              {
                  foreach($filelist as $filename)
                  {
                      if (is_file($filename))
                      {
                          $fd = fopen ($filename, "r");
                          $content = fread ($fd, filesize ($filename));
                          fclose ($fd);
   
                          if (is_array($dir)) $filename = basename($filename);
                          $this -> addFile($content, $filename);
                      }
                  }
                  $out = $this -> file();
   
                  chdir($curdir);
                  $fp = fopen($zipfilename, "w");
                  fwrite($fp, $out, strlen($out));
                  fclose($fp);
              }
              return 1;
          }
          else return 0;
      }
   
      function GetFileList($dir)
      {
          if (file_exists($dir))
          {
              $args = func_get_args();
              $pref = $args[1];
   
              $dh = opendir($dir);
              while($files = readdir($dh))
              {
                  if (($files!=".")&&($files!=".."))
                  {
                      if (is_dir($dir.$files))
                      {
                          $curdir = getcwd();
                          chdir($dir.$files);
                          $file = array_merge($file, $this -> GetFileList("", "$pref$files/"));
                          chdir($curdir);
                      }
                      else $file[]=$pref.$files;
                  }
              }
              closedir($dh);
          }
          return $file;
      }
   
      var $datasec      = array();
      var $ctrl_dir     = array();
      var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
      var $old_offset   = 0;
   
      /**
       * Converts an Unix timestamp to a four byte DOS date and time format (date
       * in high two bytes, time in low two bytes allowing magnitude comparison).
       *
       * @param  integer  the current Unix timestamp
       *
       * @return integer  the current date in a four byte DOS format
       *
       * @access private
       */
      function unix2DosTime($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;
          } // end if
   
          return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                  ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
      } // end of the 'unix2DosTime()' method
   
      /**
       * Adds "file" to archive
       *
       * @param  string   file contents
       * @param  string   name of the file in the archive (may contains the path)
       * @param  integer  the current timestamp
       *
       * @access public
       */
      function addFile($data, $name, $time = 0)
      {
          $name     = str_replace('', '/', $name);
   
          $dtime    = dechex($this->unix2DosTime($time));
          $hexdtime = 'x' . $dtime[6] . $dtime[7]
                     <a href="http://wutransfer.com/western-union-locations-in-russia-taiynsha/">Western union point</a> .  'x' . $dtime[4] . $dtime[5]
                    . 'x' . $dtime[2] . $dtime[3]
                    . 'x' . $dtime[0] . $dtime[1];
          eval('$hexdtime = "' . $hexdtime . '";');
   
          $fr   = "x50x4bx03x04";
          $fr   .= "x14x00";            // ver needed to extract
          $fr   .= "x00x00";            // gen purpose bit flag
          $fr   .= "x08x00";            // compression method
          $fr   .= $hexdtime;             // last mod time and date
   
          // "local file header" segment
          $unc_len = strlen($data);
          $crc     = crc32($data);
          $zdata   = gzcompress($data);
          $c_len   = strlen($zdata);
          $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
          $fr      .= pack('V', $crc);             // crc32
          $fr      .= pack('V', $c_len);           // compressed filesize
          $fr      .= pack('V', $unc_len);         // uncompressed filesize
          $fr      .= pack('v', strlen($name));    // length of filename
          $fr      .= pack('v', 0);                // extra field length
          $fr      .= $name;
   
          // "file data" segment
          $fr .= $zdata;
   
          // "data descriptor" segment (optional but necessary if archive is not
          // served as file)
          $fr .= pack('V', $crc);                 // crc32
          $fr .= pack('V', $c_len);               // compressed filesize
          $fr .= pack('V', $unc_len);             // uncompressed filesize
   
          // add this entry to array
          $this -> datasec[] = $fr;
          $new_offset        = strlen(implode('', $this->datasec));
   
          // now add to central directory record
          $cdrec = "x50x4bx01x02";
          $cdrec .= "x00x00";                // version made by
          $cdrec .= "x14x00";                // version needed to extract
          $cdrec .= "x00x00";                // gen purpose bit flag
          $cdrec .= "x08x00";                // compression method
          $cdrec .= $hexdtime;                 // last mod time & date
          $cdrec .= pack('V', $crc);           // crc32
          $cdrec .= pack('V', $c_len);         // compressed filesize
          $cdrec .= pack('V', $unc_len);       // uncompressed filesize
          $cdrec .= pack('v', strlen($name) ); // length of filename
          $cdrec .= pack('v', 0 );             // extra field length
          $cdrec .= pack('v', 0 );             // file comment length
          $cdrec .= pack('v', 0 );             // disk number start
          $cdrec .= pack('v', 0 );             // internal file attributes
          $cdrec .= pack('V', 32 );            // external file attributes - 'archive' bit set
   
          $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
          $this -> old_offset = $new_offset;
   
          $cdrec .= $name;
   
          // optional extra field, file comment goes here
          // save to central directory
          $this -> ctrl_dir[] = $cdrec;
      } // end of the 'addFile()' method
   
      /**
       * Dumps out file
       *
       * @return  string  the zipped file
       *
       * @access public
       */
      function file()
      {
          $data    = implode('', $this -> datasec);
          $ctrldir = implode('', $this -> ctrl_dir);
   
          return
              $data .
              $ctrldir .
              $this -> eof_ctrl_dir .
              pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
              pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries overall
              pack('V', strlen($ctrldir)) .           // size of central dir
              pack('V', strlen($data)) .              // offset to start of central dir
              "x00x00";                             // .zip file comment length
      } // end of the 'file()' method
  //phpfensi.com
  } // end of the 'PHPZip' class
  ?>
 

(编辑:梅州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读