root/trunk/plog-download.php

Revision 588, 9.2 KB (checked in by kimparsell, 3 weeks ago)

+ Minor markup changes for install/upgrade process.
+ Minor admin section changes to make action notices consistent.
+ Miscellaneous cleanup.

Line 
1<?php
2
3include(dirname(__FILE__)."/plog-load-config.php");
4if (!$config["allow_dl"]) {
5    // ignorance is bliss
6    exit();
7}
8
9/*
10
11Zip file creation class
12makes zip files on the fly...
13
14use the functions add_dir() and add_file() to build the zip file;
15see example code below
16
17by Eric Mueller
18http://www.themepark.com
19
20v1.1 9-20-01
21- added comments to example
22
23v1.0 2-5-01
24
25initial version with:
26- class appearance
27- add_file() and file() methods
28- gzcompress() output hacking
29by Denis O.Philippov, webmaster@atlant.ru, http://www.atlant.ru
30
31*/
32
33// official ZIP file format: http://www. // pkware.com/appnote.txt
34
35class zipfile {
36
37    var $datasec = array();                            // array to store compressed data
38    var $ctrl_dir = array();                                // central directory
39    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
40    var $old_offset = 0;
41
42    function add_dir($name) {
43    // adds "directory" to archive - do this before putting any files in directory!
44    // $name - name of directory... like this: "path/"
45    // ...then you can add files using add_file with names like "path/file.txt"
46
47        $name = str_replace("\\", "/", $name);
48
49        $fr = "\x50\x4b\x03\x04";
50        $fr .= "\x0a\x00";                                    // ver needed to extract
51        $fr .= "\x00\x00";                                    // gen purpose bit flag
52        $fr .= "\x00\x00";                                    // compression method
53        $fr .= "\x00\x00\x00\x00";                        // last mod time and date
54
55        $fr .= pack("V",0);                                // crc32
56        $fr .= pack("V",0);                                //compressed filesize
57        $fr .= pack("V",0);                                //uncompressed filesize
58        $fr .= pack("v", strlen($name) );            //length of pathname
59        $fr .= pack("v", 0 );                                //extra field length
60        $fr .= $name;
61        // end of "local file header" segment
62
63        // no "file data" segment for path
64
65        // "data descriptor" segment (optional but necessary if archive is not served as file)
66        $fr .= pack("V",$crc);                            //crc32
67        $fr .= pack("V",$c_len);                        //compressed filesize
68        $fr .= pack("V",$unc_len);                        //uncompressed filesize
69
70        // add this entry to array
71        $this -> datasec[] = $fr;
72
73        $new_offset = $this->old_offset + strlen ($fr) ;
74        //$new_offset = strlen(implode("", $this->datasec));
75
76        // ext. file attributes mirrors MS-DOS directory attr byte, detailed
77        // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp
78
79        // now add to central record
80        $cdrec = "\x50\x4b\x01\x02";
81        $cdrec .="\x00\x00";                            // version made by
82        $cdrec .="\x0a\x00";                            // version needed to extract
83        $cdrec .="\x00\x00";                            // gen purpose bit flag
84        $cdrec .="\x00\x00";                            // compression method
85        $cdrec .="\x00\x00\x00\x00";                    // last mod time & date
86        $cdrec .= pack("V",0);                            // crc32
87        $cdrec .= pack("V",0);                            //compressed filesize
88        $cdrec .= pack("V",0);                            //uncompressed filesize
89        $cdrec .= pack("v", strlen($name) );        //length of filename
90        $cdrec .= pack("v", 0 );                        //extra field length
91        $cdrec .= pack("v", 0 );                        //file comment length
92        $cdrec .= pack("v", 0 );                        //disk number start
93        $cdrec .= pack("v", 0 );                        //internal file attributes
94        $ext = "\x00\x00\x10\x00";
95        $ext = "\xff\xff\xff\xff";
96        $cdrec .= pack("V", 16 );                        //external file attributes  - 'directory' bit set
97
98        $cdrec .= pack("V", $this -> old_offset );    //relative offset of local header
99        $this -> old_offset = $new_offset;
100
101        $cdrec .= $name;
102        // optional extra field, file comment goes here
103        // save to array
104        $this -> ctrl_dir[] = $cdrec;
105
106    }
107
108    function add_file($data, $name) {
109    // adds "file" to archive
110    // $data - file contents
111    // $name - name of file in archive. Add path if your want
112
113        $name = str_replace("\\", "/", $name);
114        //$name = str_replace("\\", "\\\\", $name);
115
116        $fr = "\x50\x4b\x03\x04";
117        $fr .= "\x14\x00";                                    // ver needed to extract
118        $fr .= "\x00\x00";                                    // gen purpose bit flag
119        $fr .= "\x08\x00";                                    // compression method
120        $fr .= "\x00\x00\x00\x00";                        // last mod time and date
121
122        $unc_len = strlen($data);
123        $crc = crc32($data);
124        $zdata = gzcompress($data);
125        $zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
126        $c_len = strlen($zdata);
127        $fr .= pack("V",$crc);                            // crc32
128        $fr .= pack("V",$c_len);                        //compressed filesize
129        $fr .= pack("V",$unc_len);                        //uncompressed filesize
130        $fr .= pack("v", strlen($name) );            //length of filename
131        $fr .= pack("v", 0 );                                //extra field length
132        $fr .= $name;
133        // end of "local file header" segment
134
135        // "file data" segment
136        $fr .= $zdata;
137
138        // "data descriptor" segment (optional but necessary if archive is not served as file)
139        $fr .= pack("V",$crc);                            //crc32
140        $fr .= pack("V",$c_len);                        //compressed filesize
141        $fr .= pack("V",$unc_len);                        //uncompressed filesize
142
143        // add this entry to array
144        $this -> datasec[] = $fr;
145
146        $new_offset = strlen(implode("", $this->datasec));
147
148        // now add to central directory record
149        $cdrec = "\x50\x4b\x01\x02";
150        $cdrec .="\x00\x00";                            // version made by
151        $cdrec .="\x14\x00";                             // version needed to extract
152        $cdrec .="\x00\x00";                            // gen purpose bit flag
153        $cdrec .="\x08\x00";                            // compression method
154        $cdrec .="\x00\x00\x00\x00";                    // last mod time & date
155        $cdrec .= pack("V",$crc);                        // crc32
156        $cdrec .= pack("V",$c_len);                    //compressed filesize
157        $cdrec .= pack("V",$unc_len);                //uncompressed filesize
158        $cdrec .= pack("v", strlen($name) );        //length of filename
159        $cdrec .= pack("v", 0 );                        //extra field length
160        $cdrec .= pack("v", 0 );                        //file comment length
161        $cdrec .= pack("v", 0 );                        //disk number start
162        $cdrec .= pack("v", 0 );                        //internal file attributes
163        $cdrec .= pack("V", 32 );                        //external file attributes - 'archive' bit set
164
165        $cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
166        // &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset<br />";
167        $this -> old_offset = $new_offset;
168
169        $cdrec .= $name;
170        // optional extra field, file comment goes here
171        // save to central directory
172        $this -> ctrl_dir[] = $cdrec;
173    }
174
175    // dump out file
176    function file() {
177        $data = implode("", $this -> datasec);
178        $ctrldir = implode("", $this -> ctrl_dir);
179
180        return
181        $data.
182        $ctrldir.
183        $this -> eof_ctrl_dir.
184        pack("v", sizeof($this -> ctrl_dir)).        // total # of entries "on this disk"
185        pack("v", sizeof($this -> ctrl_dir)).        // total # of entries overall
186        pack("V", strlen($ctrldir)).                    // size of central dir
187        pack("V", strlen($data)).                    // offset to start of central dir
188        "\x00\x00";                                        // .zip file comment length
189    }
190}
191
192connect_db();
193
194if (!isset($_REQUEST["checked"]) || (!is_array($_REQUEST["checked"]))){
195    echo 'No pictures were selected.';
196} else {
197    create_zip($_REQUEST["checked"], $_REQUEST["dl_type"]);
198}
199
200function create_zip($checked, $level) {
201    global $zipfile;
202
203    $dir = "Plogger.".date("Y.m.d")."/";
204
205    $zipfile = new zipfile();
206    // add the subdirectory ... important!
207    // $zipfile -> add_dir($dir);
208
209    add_photos($checked, $level, $dir, $zipfile);
210
211    $output = $zipfile -> file();
212
213    // the next lines attempt to clear the cache, get the filesize, and force an immediate download of the zip file:
214    header("Pragma: public");
215    header("Expires: 0");
216    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
217    header("Cache-Control: private",false);
218    header("Content-type: application/octet-stream");
219    header("Content-disposition: attachment; filename=plog-package-".date("Y.m.d").".zip");
220    header("Content-Length: ".strlen($output));
221    header('Content-Transfer-Encoding: binary');
222    echo $output;
223
224    return;
225}
226
227function add_photos($checked, $type, $dir) {
228    global $zipfile;
229
230    if ($type == "collections"){
231        foreach ($checked as $cid){
232            $query = "SELECT * FROM `".TABLE_PREFIX."collections` WHERE `id`='".intval($cid)."'";
233            $result = run_query($query);
234
235            while ($row = mysql_fetch_assoc($result)){
236                $query = "SELECT * FROM `".TABLE_PREFIX."albums` WHERE `parent_id`='".$row["id"]."'";
237                $newresult = run_query($query);
238
239                $newchecked = array();
240
241                while ($newrow = mysql_fetch_assoc($newresult)){
242                    $newchecked[] = $newrow["id"];
243                }
244
245                $newdir = $row["name"];
246
247                $i = 1;
248
249                while (is_dir($newdir)){
250                    $newdir = $row["name"] . " (".$i++.")";
251                }
252
253                // $zipfile -> add_dir($dir . $newdir);
254
255                add_photos($newchecked, "collection", $dir . $newdir . "/");
256            }
257        }
258    } else if ($type == "collection") {
259        foreach ($checked as $aid){
260            $query = "SELECT * FROM `".TABLE_PREFIX."albums` WHERE `id`='".intval($aid)."'";
261            $result = run_query($query);
262
263            while ($row = mysql_fetch_assoc($result)){
264                $query = "SELECT * FROM `".TABLE_PREFIX."pictures` WHERE `parent_album`='".$row["id"]."'";
265                $newresult = run_query($query);
266
267                $newchecked = array();
268
269                while ($newrow = mysql_fetch_assoc($newresult)){
270                    $newchecked[] = $newrow["id"];
271                }
272
273                $newdir = $row["name"];
274
275                $i = 1;
276
277                while (is_dir($newdir)){
278                    $newdir = $row["name"] . " (".$i++.")";
279                }
280
281                // $zipfile -> add_dir($dir . $newdir);
282
283                add_photos($newchecked, "album", $dir . $newdir . "/");
284            }
285        }
286    } elseif ($type == "album" || $type == "search") {
287        foreach ($checked as $pid){
288            $query = "SELECT * FROM `".TABLE_PREFIX."pictures` WHERE `id`='".intval($pid)."'";
289            $result = run_query($query);
290
291            while ($row = mysql_fetch_assoc($result)){
292                $file_contents = file_get_contents("plog-content/images/".$row["path"], true);
293                $zipfile -> add_file($file_contents, $row["path"]);
294
295            }
296        }
297    }
298
299    return;
300}
301
302?>
Note: See TracBrowser for help on using the browser.