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
?>