| 1: | <?php
|
| 2: |
|
| 3: | |
| 4: | |
| 5: | |
| 6: | |
| 7: | |
| 8: | |
| 9: | |
| 10: | |
| 11: | |
| 12: | |
| 13: | |
| 14: | |
| 15: | |
| 16: | |
| 17: | |
| 18: | |
| 19: | |
| 20: | |
| 21: | |
| 22: | |
| 23: | |
| 24: | |
| 25: | |
| 26: | |
| 27: | |
| 28: | |
| 29: | |
| 30: |
|
| 31: | class Zipfile
|
| 32: | {
|
| 33: | |
| 34: | |
| 35: | |
| 36: | |
| 37: |
|
| 38: | public $datasec = array();
|
| 39: |
|
| 40: | |
| 41: | |
| 42: | |
| 43: | |
| 44: |
|
| 45: | public $ctrl_dir = array();
|
| 46: |
|
| 47: | |
| 48: | |
| 49: | |
| 50: | |
| 51: |
|
| 52: | public $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
|
| 53: |
|
| 54: | |
| 55: | |
| 56: | |
| 57: | |
| 58: |
|
| 59: | public $old_offset = 0;
|
| 60: |
|
| 61: | |
| 62: | |
| 63: | |
| 64: | |
| 65: | |
| 66: | |
| 67: | |
| 68: | |
| 69: |
|
| 70: | public function unix2DosTime($unixtime = 0)
|
| 71: | {
|
| 72: | $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
|
| 73: | if ($timearray['year'] < 1980) {
|
| 74: | $timearray['year'] = 1980;
|
| 75: | $timearray['mon'] = 1;
|
| 76: | $timearray['mday'] = 1;
|
| 77: | $timearray['hours'] = 0;
|
| 78: | $timearray['minutes'] = 0;
|
| 79: | $timearray['seconds'] = 0;
|
| 80: | }
|
| 81: |
|
| 82: | return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
|
| 83: | }
|
| 84: |
|
| 85: | |
| 86: | |
| 87: | |
| 88: | |
| 89: | |
| 90: | |
| 91: | |
| 92: |
|
| 93: | public function addFile($data, $name, $time = 0)
|
| 94: | {
|
| 95: | $name = str_replace('\\', '/', $name);
|
| 96: |
|
| 97: | $dtime = dechex($this->unix2DosTime($time));
|
| 98: | $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1];
|
| 99: | eval('$hexdtime = "' . $hexdtime . '";');
|
| 100: |
|
| 101: | $fr = "\x50\x4b\x03\x04";
|
| 102: | $fr .= "\x14\x00";
|
| 103: | $fr .= "\x00\x00";
|
| 104: | $fr .= "\x08\x00";
|
| 105: | $fr .= $hexdtime;
|
| 106: |
|
| 107: | $unc_len = strlen($data);
|
| 108: | $crc = crc32($data);
|
| 109: | $zdata = gzcompress($data);
|
| 110: | $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
|
| 111: | $c_len = strlen($zdata);
|
| 112: | $fr .= pack('V', $crc);
|
| 113: | $fr .= pack('V', $c_len);
|
| 114: | $fr .= pack('V', $unc_len);
|
| 115: | $fr .= pack('v', strlen($name));
|
| 116: | $fr .= pack('v', 0);
|
| 117: | $fr .= $name;
|
| 118: |
|
| 119: | $fr .= $zdata;
|
| 120: |
|
| 121: |
|
| 122: | $fr .= pack('V', $crc);
|
| 123: | $fr .= pack('V', $c_len);
|
| 124: | $fr .= pack('V', $unc_len);
|
| 125: |
|
| 126: | $this->datasec[] = $fr;
|
| 127: | $new_offset = strlen(implode('', $this->datasec));
|
| 128: |
|
| 129: | $cdrec = "\x50\x4b\x01\x02";
|
| 130: | $cdrec .= "\x00\x00";
|
| 131: | $cdrec .= "\x14\x00";
|
| 132: | $cdrec .= "\x00\x00";
|
| 133: | $cdrec .= "\x08\x00";
|
| 134: | $cdrec .= $hexdtime;
|
| 135: | $cdrec .= pack('V', $crc);
|
| 136: | $cdrec .= pack('V', $c_len);
|
| 137: | $cdrec .= pack('V', $unc_len);
|
| 138: | $cdrec .= pack('v', strlen($name));
|
| 139: | $cdrec .= pack('v', 0);
|
| 140: | $cdrec .= pack('v', 0);
|
| 141: | $cdrec .= pack('v', 0);
|
| 142: | $cdrec .= pack('v', 0);
|
| 143: | $cdrec .= pack('V', 32);
|
| 144: | $cdrec .= pack('V', $this->old_offset);
|
| 145: | $this->old_offset = $new_offset;
|
| 146: | $cdrec .= $name;
|
| 147: |
|
| 148: |
|
| 149: | $this->ctrl_dir[] = $cdrec;
|
| 150: | }
|
| 151: |
|
| 152: | |
| 153: | |
| 154: | |
| 155: | |
| 156: | |
| 157: |
|
| 158: | public function file()
|
| 159: | {
|
| 160: | $data = implode('', $this->datasec);
|
| 161: | $ctrldir = implode('', $this->ctrl_dir);
|
| 162: |
|
| 163: | return $data . $ctrldir . $this->eof_ctrl_dir . pack('v', count($this->ctrl_dir)) .
|
| 164: | pack('v', count($this->ctrl_dir)) .
|
| 165: | pack('V', strlen($ctrldir)) .
|
| 166: | pack('V', strlen($data)) .
|
| 167: | "\x00\x00";
|
| 168: | }
|
| 169: | }
|
| 170: |
|
| 171: | |