PHP File Compression code online
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 a Unix timestamp to a four byte DOS date and time format
(Date
* In high and bytes, time in low 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 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 are
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.
Eof_ctrl_dir, $this.
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
}
http://www.bkjia.com/PHPjc/444935.html www.bkjia.com true http://www.bkjia.com/PHPjc/444935.html techarticle php File online compression code class Phpzip {function Zip ($dir, $zipfilename) {if (@function_exists (' gzcompress ')) {$curdir = GETCWD ( ); if (Is_array ($dir)) {$filelist = $dir;} e ...