ArchiveZip.class.php (1850B)
1 <?php 2 3 4 namespace util; 5 /** 6 * This source is taken from http://www.zend.com/zend/spotlight/creating-zip-files1.php 7 * Thank you! 8 */ 9 class ArchiveZip 10 { 11 var $datasec = array(); 12 var $ctrl_dir = array(); 13 var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; 14 var $old_offset = 0; 15 16 17 function add_file($data, $name) 18 { 19 $name = str_replace("\\", "/", $name); 20 $unc_len = strlen($data); 21 $crc = crc32($data); 22 $zdata = gzcompress($data); 23 $zdate = substr($zdata, 2, -4); 24 $c_len = strlen($zdata); 25 26 27 $fr = "\x50\x4b\x03\x04"; 28 $fr .= "\x14\x00"; 29 $fr .= "\x00\x00"; 30 $fr .= "\x08\x00"; 31 $fr .= "\x00\x00\x00\x00"; 32 $fr .= pack("V", $crc); 33 $fr .= pack("V", $c_len); 34 $fr .= pack("V", $unc_len); 35 $fr .= pack("v", strlen($name)); 36 $fr .= pack("v", 0); 37 $fr .= $name; 38 $fr .= $zdata; 39 $fr .= pack("V", $crc); 40 $fr .= pack("V", $c_len); 41 $fr .= pack("V", $unc_len); 42 43 $this->datasec[] = $fr; 44 45 46 $new_offset = strlen(implode("", $this->datasec)); 47 48 $cdrec = "\x50\x4b\x01\x02"; 49 $cdrec .= "\x00\x00"; 50 $cdrec .= "\x14\x00"; 51 $cdrec .= "\x00\x00"; 52 $cdrec .= "\x08\x00"; 53 $cdrec .= "\x00\x00\x00\x00"; 54 $cdrec .= pack("V", $crc); 55 $cdrec .= pack("V", $c_len); 56 $cdrec .= pack("V", $unc_len); 57 $cdrec .= pack("v", strlen($name)); 58 $cdrec .= pack("v", 0); 59 $cdrec .= pack("v", 0); 60 $cdrec .= pack("v", 0); 61 $cdrec .= pack("v", 0); 62 $cdrec .= pack("V", 32); 63 $cdrec .= pack("V", $this->old_offset); 64 65 $this->old_offset = $new_offset; 66 67 $cdrec .= $name; 68 $this->ctrl_dir[] = $cdrec; 69 } 70 71 72 function file() 73 { 74 $data = implode("", $this->datasec); 75 $ctrldir = implode("", $this->ctrl_dir); 76 77 return 78 $data . 79 $ctrldir . 80 $this->eof_ctrl_dir . 81 pack("v", sizeof($this->ctrl_dir)) . 82 pack("v", sizeof($this->ctrl_dir)) . 83 pack("V", strlen($ctrldir)) . 84 pack("V", strlen($data)) . 85 "\x00\x00"; 86 } 87 } 88 89 ?>