1. Please download my prepared zip.php tool class, download and unzip, put the file in the corresponding directory, I was placed in the virtual directory under the Include folder.
2. Add the following code to your PHP file
Copy Code code as follows:
Require_once "./include/zip.php";
$zip = new Phpzip ();
$zip-> createzip ("folder directory address to compress", "compressed file name. zip"); Generate No automatic downloads only
$zip-> downloadzip ("folder directory address to compress", "compressed file name. zip"); Automatic download
Example: You can refer to the following pseudocode to see a specific use scenario:
Code
Copy Code code as follows:
Require_once "./include/zip.php";
if (! $download) {
Exit ();
}
Set_time_limit (60);
$tmpManager = new Tmpmanager (); Let's say we have a class to do the following.
$tempfolder = Array ();
$tempfile = Array ();
Suppose we download the selected folder or file by selecting a checkbox on the page and packing together
for ($i = 0; $i < $checkboxnum; $i + +) {
$value = ${"select". $i};
if ($value!= ') {
$this _type = substr ($value, 0, 1);
$this _id = substr ($value, 1);
Separate folder and file conditions
if ($this _type = = ' d ') {
$tempfolder [] = $this _id;
}
ElseIf ($this _type = = ' F ') {
$tempfile [] = $this _id;
}
}
}
@mkdir ($tempdir);
$curtempdir = "$tempdir/" $userid; Different users operate in different temporary folders
if (file_exists ($curtempdir)) {
$tmpManager->deletedir ($curtempdir); Delete old folders
}
if (sizeof ($tempfolder) > 0 | | sizeof ($TEMPFILE) > 0) {
mkdir ($curtempdir, 0777); If you have a file folder to package, recreate the folder
}
if (sizeof ($tempfile) > 0) {
$tmpManager->copyfile ($tempfile, $curtempdir); Copy the file you want to download to the folder you created
}
if (sizeof ($tempfolder) > 0) {
$tmpManager->copyfolder ($tempfolder, $curtempdir); Copy the folder you want to download to the folder you created
}
$zip = new Phpzip ();
$zip-> downloadzip ($curtempdir, "File_". Date (' Ymd '). Zip "); Package and download
zip.php
Copy Code code as follows:
<?php
/*
File Name:/include/zip.php
Author:horace 2009/04/15
*/
Class phpzip{
var $dirInfo = Array ("0", "0");
var $rootDir = ';
var $datasec = array ();
var $ctrl _dir = Array ();
var $eof _ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old _offset = 0;
function Downloadzip () {
Createzip ($dir, $zipfilename, true);
}
function Createzip ($dir, $zipfilename, $autoDownload = False) {
if (@function_exists (' gzcompress ')) {
@set_time_limit ("0");
if (Is_array ($dir)) {
$FD = fopen ($dir, "R");
$fileValue = Fread ($FD, FileSize ($filename));
Fclose ($FD);
if (Is_array ($dir)) $filename = basename ($dir);
$this-> AddFile ($fileValue, "$filename");
}else{
$this->dirtree ($dir, $dir);
}
$zipfilenametemp = Time (). $zipfilename;
$out = $this-> filezip ();
$fp = fopen ($zipfilenametemp, "w");
Fwrite ($fp, $out, strlen ($out));
Fclose ($FP);
$filesize = FileSize ($zipfilenametemp);
if ($filesize < 104857600) {
if ($autoDownload) {
Header ("Content-type:application/octet-stream");
Header ("content-disposition:attachment; Filename= ". $zipfilename);
}
echo $this-> filezip ();
}else{
echo "Create zip error!";
}
Unlink ($zipfilenametemp);
}
}
Get dir..
function DirTree ($directory, $rootDir) {
Global $_server, $dirInfo, $rootDir;
$fileDir = $rootDir;
$myDir =dir ($directory);
while ($file = $myDir->read ()) {
if (Is_dir ("$directory/$file") and $file!= "." and $file!= "...") {
$dirInfo [0]++;
$rootDir = "$fileDir $file/";
$this-> addfile (", $rootDir");
Go on n ' s folders
$this->dirtree ("$directory/$file", $rootDir);
}else{
if ($file!= "." and $file!= "...") {
$dirInfo [1]++;
$FD = fopen ("$directory/$file", "R");
$fileValue = file_get_contents ("$directory/$file");
Fclose ($FD);
$this-> AddFile ($fileValue, "$fileDir $file");
}
}
}
$myDir->close ();
}
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);
}
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 = "\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 the "Now" 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
$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 the \ Directory
$this-> ctrl_dir[] = $cdrec;
}
function Filezip () {
$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
Pack (' V ', strlen ($data)). Offset to start of the
"\x00\x00"; . zip file Comment length
}
}
?>
zip.php File Packaging