Создаём zip в PHP на лету
Code (php)
-
-
<?php
-
/*
-
-
Zip file creation class
-
makes zip files on the fly…
-
-
use the functions add_dir() and add_file() to build the zip file;
-
see example code below
-
-
by Eric Mueller
-
http://www.themepark.com
-
-
v1.1 9-20-01
-
- added comments to example
-
-
v1.0 2-5-01
-
-
initial version with:
-
- class appearance
-
- add_file() and file() methods
-
- gzcompress() output hacking
-
by Denis O.Philippov, webmaster@atlant.ru, http://www.atlant.ru
-
-
*/
-
-
// official ZIP file format: http://www. // pkware.com/appnote.txt
-
-
class zipfile
-
{
-
-
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
-
var $old_offset = 0;
-
-
function add_dir($name)
-
-
// adds "directory" to archive - do this before putting any files in directory!
-
// $name - name of directory… like this: "path/"
-
// …then you can add files using add_file with names like "path/file.txt"
-
{
-
-
$fr = "\x50\x4b\x03\x04";
-
$fr .= "\x0a\x00"; // ver needed to extract
-
$fr .= "\x00\x00"; // gen purpose bit flag
-
$fr .= "\x00\x00"; // compression method
-
$fr .= "\x00\x00\x00\x00"; // last mod time and date
-
-
$fr .= $name;
-
// end of "local file header" segment
-
-
// no "file data" segment for path
-
-
// "data descriptor" segment (optional but necessary if archive is not served as file)
-
-
// add this entry to array
-
$this -> datasec[] = $fr;
-
-
-
// ext. file attributes mirrors MS-DOS directory attr byte, detailed
-
// at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp
-
-
// now add to central record
-
$cdrec = "\x50\x4b\x01\x02";
-
$cdrec .="\x00\x00"; // version made by
-
$cdrec .="\x0a\x00"; // version needed to extract
-
$cdrec .="\x00\x00"; // gen purpose bit flag
-
$cdrec .="\x00\x00"; // compression method
-
$cdrec .="\x00\x00\x00\x00"; // last mod time & date
-
$ext = "\x00\x00\x10\x00";
-
$ext = "\xff\xff\xff\xff";
-
-
$this -> old_offset = $new_offset;
-
-
$cdrec .= $name;
-
// optional extra field, file comment goes here
-
// save to array
-
$this -> ctrl_dir[] = $cdrec;
-
-
-
}
-
-
-
function add_file($data, $name)
-
-
// adds "file" to archive
-
// $data - file contents
-
// $name - name of file in archive. Add path if your want
-
-
{
-
//$name = str_replace("\\", "\\\\", $name);
-
-
$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 .= "\x00\x00\x00\x00"; // last mod time and date
-
-
$fr .= $name;
-
// end of "local file header" segment
-
-
// "file data" segment
-
$fr .= $zdata;
-
-
// "data descriptor" segment (optional but necessary if archive is not served as file)
-
-
// add this entry to array
-
$this -> datasec[] = $fr;
-
-
-
// 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 .="\x00\x00\x00\x00"; // last mod time & date
-
-
// &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset
-
";
-
$this -> old_offset = $new_offset;
-
-
$cdrec .= $name;
-
// optional extra field, file comment goes here
-
// save to central directory
-
$this -> ctrl_dir[] = $cdrec;
-
}
-
-
function file() { // dump out 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
-
}
-
}
-
-
?>
-
-
Example Usage of the Class
-
-
<?php
-
-
$zipfile = new zipfile();
-
-
// add the subdirectory … important!
-
-
// add the binary data stored in the string ‘filedata’
-
-
// the next three lines force an immediate download of the zip file:
-
header("Content-type: application/octet-stream");
-
header("Content-disposition: attachment; filename=test.zip");
-
echo $zipfile -> file();
-
-
-
// OR instead of doing that, you can write out the file to the loca disk like this:
-
$filename = "output.zip";
-
$fd = fopen ($filename, "wb");
-
$out = fwrite ($fd, $zipfile -> file());
-
fclose ($fd);
-
-
// then offer it to the user to download:
-
<a href="output.zip">Click here to download the new zip file.</a>
-
?>
-
-
