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: | |