php文件压缩之PHPZip类用法实例

前端之家收集整理的这篇文章主要介绍了php文件压缩之PHPZip类用法实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例讲述了PHP文件压缩之PHPZip类用法分享给大家供大家参考。具体如下:

PHP;"> 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['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]
    . '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,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
    } // end of the 'PHPZip' class
    ?>

使用方法

PHP;"> Zip("","out1.zip"); //添加当前目录和子目录下的所有档案 //方法二: $files=array('1.txt','gb.txt'); $files[]='5.txt'; $z -> Zip($files,"out2.zip"); //添加文件列表 //方法三: $z -> Zip("/usr/local/sext/","out3.zip"); //添加指定目录 ?>

希望本文所述对大家的PHP程序设计有所帮助。

原文链接:https://www.f2er.com/php/21747.html

猜你在找的PHP相关文章