00001 <?php
00002
00003
00004
00005
00025 class zipfile
00026 {
00032 var $datasec = array();
00033
00039 var $ctrl_dir = array();
00040
00046 var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
00047
00053 var $old_offset = 0;
00054
00055
00066 function unix2DosTime($unixtime = 0) {
00067 $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
00068
00069 if ($timearray['year'] < 1980) {
00070 $timearray['year'] = 1980;
00071 $timearray['mon'] = 1;
00072 $timearray['mday'] = 1;
00073 $timearray['hours'] = 0;
00074 $timearray['minutes'] = 0;
00075 $timearray['seconds'] = 0;
00076 }
00077
00078 return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
00079 ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
00080 }
00081
00082
00092 function addFile($data, $name, $time = 0)
00093 {
00094 $name = str_replace('\\', '/', $name);
00095
00096 $dtime = dechex($this->unix2DosTime($time));
00097 $hexdtime = '\x' . $dtime[6] . $dtime[7]
00098 . '\x' . $dtime[4] . $dtime[5]
00099 . '\x' . $dtime[2] . $dtime[3]
00100 . '\x' . $dtime[0] . $dtime[1];
00101 eval('$hexdtime = "' . $hexdtime . '";');
00102
00103 $fr = "\x50\x4b\x03\x04";
00104 $fr .= "\x14\x00";
00105 $fr .= "\x00\x00";
00106 $fr .= "\x08\x00";
00107 $fr .= $hexdtime;
00108
00109
00110 $unc_len = strlen($data);
00111 $crc = crc32($data);
00112 $zdata = gzcompress($data);
00113 $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
00114 $c_len = strlen($zdata);
00115 $fr .= pack('V', $crc);
00116 $fr .= pack('V', $c_len);
00117 $fr .= pack('V', $unc_len);
00118 $fr .= pack('v', strlen($name));
00119 $fr .= pack('v', 0);
00120 $fr .= $name;
00121
00122
00123 $fr .= $zdata;
00124
00125
00126
00127 $fr .= pack('V', $crc);
00128 $fr .= pack('V', $c_len);
00129 $fr .= pack('V', $unc_len);
00130
00131
00132 $this -> datasec[] = $fr;
00133
00134
00135 $cdrec = "\x50\x4b\x01\x02";
00136 $cdrec .= "\x00\x00";
00137 $cdrec .= "\x14\x00";
00138 $cdrec .= "\x00\x00";
00139 $cdrec .= "\x08\x00";
00140 $cdrec .= $hexdtime;
00141 $cdrec .= pack('V', $crc);
00142 $cdrec .= pack('V', $c_len);
00143 $cdrec .= pack('V', $unc_len);
00144 $cdrec .= pack('v', strlen($name) );
00145 $cdrec .= pack('v', 0 );
00146 $cdrec .= pack('v', 0 );
00147 $cdrec .= pack('v', 0 );
00148 $cdrec .= pack('v', 0 );
00149 $cdrec .= pack('V', 32 );
00150
00151 $cdrec .= pack('V', $this -> old_offset );
00152 $this -> old_offset += strlen($fr);
00153
00154 $cdrec .= $name;
00155
00156
00157
00158 $this -> ctrl_dir[] = $cdrec;
00159 }
00160
00161
00169 function file()
00170 {
00171 $data = implode('', $this -> datasec);
00172 $ctrldir = implode('', $this -> ctrl_dir);
00173
00174 return
00175 $data .
00176 $ctrldir .
00177 $this -> eof_ctrl_dir .
00178 pack('v', sizeof($this -> ctrl_dir)) .
00179 pack('v', sizeof($this -> ctrl_dir)) .
00180 pack('V', strlen($ctrldir)) .
00181 pack('V', strlen($data)) .
00182 "\x00\x00";
00183 }
00184
00185 }
00186 ?>