- /*
- 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 tree.
- 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 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 = "/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 Central directory
- $this-ctrl_dir[] = $cdrec;
- }
- function Filezip () {
- $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 the central Dir
- "/x00/x00"; . zip file Comment length
- }
- }
- ?>
- There's another one that's relatively simple.
- [PHP] View plaincopy
-
- Class Createzip
- {
- /* @creates A compressed zip file to compress multiple files into a single zip function
- * @ $files Array type instance, array ("1.jpg", "2.jpg");
- * @destination the path to the target file, such as "C:/androidyue.zip"
- * @ $overwrite whether to overwrite the same file as the target file
- * @Recorded by Androidyue
- * @Blog: http://thinkblog.sinaapp.com
- */
- function Create_zip ($files = Array (), $destination = "", $overwrite = False)
- {
- Returns False if the zip file already exists and is set to No Override
- if (file_exists ($destination) &&! $overwrite) {return false;}
- $valid _files = Array ();
- If files were passed in ...
- Get to a real valid file name
- if (Is_array ($files)) {
- Cycle through each file
- foreach ($files as $file) {
- Make sure the file exists
- if (file_exists ($file)) {
- $valid _files[] = $file;
- }
- }
- }
- If there is a real valid file
- if (count ($valid _files))
- {
- Create the Archive
- $zip = new Ziparchive ();
- Open file Overwrite if file already exists, if not, create
- if ($zip->open ($destination, $overwrite? Ziparchive::overwrite:ziparchive::create)!== true) {
- return false;
- }
- To add a file to a compressed file
- foreach ($valid _files as $file) {
- $zip->addfile ($file, $file);
- }
- Close File
- $zip->close ();
- Detects if a file exists
- return file_exists ($destination);
- }
- else{
- False if no real valid file is returned
- return false;
- }
- }
- }
- /****
- Test function
- $files =array (' temp.php ', ' test.php ');
- Create_zip ($files, ' Myzipfile.zip ', true);
- ****/
- ?>
Copy Code
|