All pastes #618413 Raw Edit

Mine

public php v1 · immutable
·published 2007-07-13 23:14 UTC
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	}}  ?>