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;
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;
}
return
((
$timearray
['year'] - 1980) << 25) | (
$timearray
['mon'] << 21) | (
$timearray
['mday'] << 16) |
(
$timearray
['hours'] << 11) | (
$timearray
['minutes'] << 5) | (
$timearray
['seconds'] >> 1);
}
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"
;
$fr
.=
"x00x00"
;
$fr
.=
"x08x00"
;
$fr
.=
$hexdtime
;
$unc_len
=
strlen
(
$data
);
$crc
= crc32(
$data
);
$zdata
= gzcompress(
$data
);
$c_len
=
strlen
(
$zdata
);
$zdata
=
substr
(
substr
(
$zdata
, 0,
strlen
(
$zdata
) - 4), 2);
$fr
.= pack('V',
$crc
);
$fr
.= pack('V',
$c_len
);
$fr
.= pack('V',
$unc_len
);
$fr
.= pack('v',
strlen
(
$name
));
$fr
.= pack('v', 0);
$fr
.=
$name
;
$fr
.=
$zdata
;
$fr
.= pack('V',
$crc
);
$fr
.= pack('V',
$c_len
);
$fr
.= pack('V',
$unc_len
);
$this
-> datasec[] =
$fr
;
$new_offset
=
strlen
(implode('',
$this
->datasec));
$cdrec
=
"x50x4bx01x02"
;
$cdrec
.=
"x00x00"
;
$cdrec
.=
"x14x00"
;
$cdrec
.=
"x00x00"
;
$cdrec
.=
"x08x00"
;
$cdrec
.=
$hexdtime
;
$cdrec
.= pack('V',
$crc
);
$cdrec
.= pack('V',
$c_len
);
$cdrec
.= pack('V',
$unc_len
);
$cdrec
.= pack('v',
strlen
(
$name
) );
$cdrec
.= pack('v', 0 );
$cdrec
.= pack('v', 0 );
$cdrec
.= pack('v', 0 );
$cdrec
.= pack('v', 0 );
$cdrec
.= pack('V', 32 );
$cdrec
.= pack('V',
$this
-> old_offset );
$this
-> old_offset =
$new_offset
;
$cdrec
.=
$name
;
$this
-> ctrl_dir[] =
$cdrec
;
}
function
file()
{
$data
= implode('',
$this
-> datasec);
$ctrldir
= implode('',
$this
-> ctrl_dir);
return
$data
.
$ctrldir
.
$this
-> eof_ctrl_dir .
pack('v', sizeof(
$this
-> ctrl_dir)) .
pack('v', sizeof(
$this
-> ctrl_dir)) .
pack('V',
strlen
(
$ctrldir
)) .
pack('V',
strlen
(
$data
)) .
"x00x00"
;
}
}
?>
<?php
$z
=
new
PHPZip();
方法一:
$z
-> Zip(
""
,
"out1.zip"
);
方法二:
$files
=
array
('1.txt','gb.txt');
$files
[]='5.txt';
$z
-> Zip(
$files
,
"out2.zip"
);
方法三:
$z
-> Zip(
"/usr/local/sext/"
,
"out3.zip"
);
?>