一个完美的PHP ZIP压缩类代码
本程序可以快速的实现把我们的文件利用php压缩类压缩成我们想的zip,或者rar 的压缩包,后缀名可以自定义哦, 压缩算法是来自国外一个网站抄的。
首先实例化,然后传参。两个参数。第一个关于你文件地址的一个Array。第二个是要你要保存的压缩包文件的绝对地址。
For example:
$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 ((!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, 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 } // end of the 'PHPZip' class ?>
本文地址:http://www.phprm.com/frame/php1005362.html
转载随意,但请附上文章地址:-)