Maison  >  Article  >  développement back-end  >  Définition et utilisation de la classe PHPZip

Définition et utilisation de la classe PHPZip

墨辰丷
墨辰丷original
2018-06-09 16:19:491679parcourir

Cet article présente principalement la définition et l'utilisation de la classe PHPZip. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

L'exemple de cet article décrit l'utilisation de la classe PHPZip pour la compression de fichiers php, comme suit :

<?php
//
// PHPZip v1.2 by Sext (sext@neud.net) 
//
// Makes zip archive
//
// Based on "Zip file creation class", uses zLib
//
//
class PHPZip
{
function Zip($dir, $zipfilename)
{
    if (@function_exists(&#39;gzcompress&#39;))
    {
     $curdir = getcwd();
     if (is_array($dir))
     {
          $filelist = $dir;
     }
     else
     {
      $filelist = $this -> GetFileList($dir);
     }
     if ((!empty($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[&#39;year&#39;] < 1980) {
     $timearray[&#39;year&#39;] = 1980;
     $timearray[&#39;mon&#39;]   = 1;
     $timearray[&#39;mday&#39;] = 1;
     $timearray[&#39;hours&#39;] = 0;
     $timearray[&#39;minutes&#39;] = 0;
     $timearray[&#39;seconds&#39;] = 0;
    } // end if
    return (($timearray[&#39;year&#39;] - 1980) << 25) | ($timearray[&#39;mon&#39;] << 21) | ($timearray[&#39;mday&#39;] << 16) |
      ($timearray[&#39;hours&#39;] << 11) | ($timearray[&#39;minutes&#39;] << 5) | ($timearray[&#39;seconds&#39;] >> 1);
} // end of the &#39;unix2DosTime()&#39; 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(&#39;&#39;, &#39;/&#39;, $name);
 
    $dtime = dechex($this->unix2DosTime($time));
    $hexdtime = &#39;x&#39; . $dtime[6] . $dtime[7]
        . &#39;x&#39; . $dtime[4] . $dtime[5]
        . &#39;x&#39; . $dtime[2] . $dtime[3]
        . &#39;x&#39; . $dtime[0] . $dtime[1];
    eval(&#39;$hexdtime = "&#39; . $hexdtime . &#39;";&#39;);
    $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(&#39;V&#39;, $crc);     // crc32
    $fr  .= pack(&#39;V&#39;, $c_len);      // compressed filesize
    $fr  .= pack(&#39;V&#39;, $unc_len);    // uncompressed filesize
    $fr  .= pack(&#39;v&#39;, strlen($name)); // length of filename
    $fr  .= pack(&#39;v&#39;, 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(&#39;V&#39;, $crc);         // crc32
    $fr .= pack(&#39;V&#39;, $c_len);       // compressed filesize
    $fr .= pack(&#39;V&#39;, $unc_len);     // uncompressed filesize
    // add this entry to array
    $this -> datasec[] = $fr;
    $new_offset    = strlen(implode(&#39;&#39;, $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(&#39;V&#39;, $crc);      // crc32
    $cdrec .= pack(&#39;V&#39;, $c_len);    // compressed filesize
    $cdrec .= pack(&#39;V&#39;, $unc_len);  // uncompressed filesize
    $cdrec .= pack(&#39;v&#39;, strlen($name) ); // length of filename
    $cdrec .= pack(&#39;v&#39;, 0 );     // extra field length
    $cdrec .= pack(&#39;v&#39;, 0 );     // file comment length
    $cdrec .= pack(&#39;v&#39;, 0 );     // disk number start
    $cdrec .= pack(&#39;v&#39;, 0 );     // internal file attributes
    $cdrec .= pack(&#39;V&#39;, 32 );     // external file attributes - &#39;archive&#39; bit set
    $cdrec .= pack(&#39;V&#39;, $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 &#39;addFile()&#39; method
/**
  * Dumps out file
  *
  * @return  string  the zipped file
  *
  * @access public
  */
function file()
{
    $data = implode(&#39;&#39;, $this -> datasec);
    $ctrldir = implode(&#39;&#39;, $this -> ctrl_dir);
 
    return
     $data .
     $ctrldir .
     $this -> eof_ctrl_dir .
     pack(&#39;v&#39;, sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
     pack(&#39;v&#39;, sizeof($this -> ctrl_dir)) .  // total # of entries overall
     pack(&#39;V&#39;, strlen($ctrldir)) .      // size of central dir
     pack(&#39;V&#39;, strlen($data)) .       // offset to start of central dir
     "x00x00";               // .zip file comment length
} // end of the &#39;file()&#39; method
} // end of the &#39;PHPZip&#39; class
?>

Utilisation :

<?php
$z = new PHPZip(); //新建立一个zip的类
//方法一:
$z -> Zip("", "out1.zip"); //添加当前目录和子目录下的所有档案
//方法二:
$files=array(&#39;1.txt&#39;,&#39;gb.txt&#39;);
$files[]=&#39;5.txt&#39;;
$z -> Zip($files, "out2.zip"); //添加文件列表
//方法三:
$z -> Zip("/usr/local/sext/", "out3.zip"); //添加指定目录
?>

Résumé : Nous espérons que l’ensemble du contenu de cet article sera utile à l’étude de chacun.

Recommandations associées :

Méthode d'opération récursive de PHP pour les fichiers

PHP accepte les fichiers et obtient la méthode du nom de suffixe

Partage récapitulatif du traitement des fonctions de session PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn