rendered paste body<?php/** * Zip file class * * base on article: http://zend.com/codex.php?id=696&single=1 * * @version $Id: ZipFile.class.php 1 2006-05-01 14:30:26Z tvlgiao $ * @author Giao Trinh (giao@tvlgiao.com) * @package Lib * @subpackage Archive *//** * Zip file class * * @package Lib * @subpackage Archive */class ZipFile { /** * array store compressed data * @access private */ var $datasec = array(); /** * central directory * @access private */ var $ctrl_dir = array(); /** * end of central directory record * @access private */ var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; /** * last offset position * @access private */ var $old_offset = 0; /** * Add "directory" to archive * * @param string $name name of directory (like: "path/"), add file * using add_file() with name "path/filename.txt" * @see add_file() */ function add_dir($name) { $name = str_replace("\\", "/", $name); //echo "$name <br />"; $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 /* "local file header" segment */ $fr .= pack("V", 0); // crc32 $fr .= pack("V", 0); //compressed filesize $fr .= pack("V", 0); //uncompressed filesize $fr .= pack("v", strlen($name) ); //length of pathname $fr .= pack("v", 0 ); //extra field length $fr .= $name; /* no "file data" segment for path*/ /* "data descriptor" segment (optional but necessary if archive is not served as file) */ $fr .= pack("V", 0); //crc32 $fr .= pack("V", 0); //compressed filesize $fr .= pack("V", 0); //uncompressed filesize /* 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 .="\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 $cdrec .= pack("V", 0); // crc32 $cdrec .= pack("V", 0); //compressed filesize $cdrec .= pack("V", 0); //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", 16); //external file attributes - 'directory' bit set $cdrec .= pack("V", $this->old_offset ); //relative offset of local header $this->old_offset += strlen($fr); $cdrec .= $name; /* optional extra field, file comment goes here */ /* save to central directory */ $this->ctrl_dir[] = $cdrec; } /** * Add "file" to archive * * @param string $data file contents * @param string $name filename (include path) */ function add_file($data, $name) { $name = str_replace("\\", "/", $name); //echo "$name <br />"; $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 /* "local file header" segment */ $unc_len = strlen($data); $crc = crc32($data); $zdata = gzcompress($data); $zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug $c_len = strlen($zdata); $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; /* 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 $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 += strlen($fr); $cdrec .= $name; /* optional extra field, file comment goes here */ /* save to central directory */ $this->ctrl_dir[] = $cdrec; } /** * Dump out file * * @return string zip file's content */ 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 }} ?>