php ZIP压缩类实例分享
2020-12-13 01:41
标签:des blog class code java tar php ZIP压缩类实例分享 PHP的ZIP压缩类: chdir($curdir); function GetFileList($dir) $dh = opendir($dir); var $datasec = array(); $dtime = dechex($ $fr = $cdrec .= pack( $cdrec .= $name; } 文章来自:http://bbs.it-home.org/forum-php-1.html php ZIP压缩类实例分享,搜素材,soscw.com php ZIP压缩类实例分享 标签:des blog class code java tar 原文地址:http://www.cnblogs.com/baker668/p/3709897.html
$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); //添加文件列表
## 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();
$fp = fopen($zipfilename, "w");
fwrite($fp, $out, strlen($out));fclose($fp);}return
1;
}else return 0;
}{if (file_exists($dir))
{$args = func_get_args();$pref = $args[1];
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 $ctrl_dir = array();var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
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);
this->unix2DosTime($time));
$hexdtime = ‘\x‘
. $dtime[6] . $dtime[7]
Western union point . ‘\x‘
. $dtime[4] . $dtime[5]
. ‘\x‘
. $dtime[2] . $dtime[3]
. ‘\x‘
. $dtime[0] . $dtime[1];
eval(‘$hexdtime = "‘
. $hexdtime . ‘";‘);
"\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // 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 = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // 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
‘V‘, $this
-> old_offset ); // relative offset of local header
$this
-> old_offset = $new_offset;
// 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
"\x00\x00"; // .zip file comment length
} // end of the ‘file()‘ method
// end of the ‘PHPZip‘ class
?>