Creating ZIP Files on the Spot
This interesting article found on Zend.com will explain to you how to create ZIP files on the fly using PHP.
AI
ملخص الذكاء الاصطناعي: This codebase represents a historical implementation of the logic described in the metadata. Our preservation engine analyzes the structure to provide context for modern developers.
كود المصدر
Upload <font size="2" face="Arial">Ever wondered how you could create ZIP files on the fly? In this article, which I found on Zend.com, you'll be able to. The original version can be found here: http://www.zend.com/zend/spotlight/creating-zip-files2.php</font> <br> <blockquote> <p><code><font color="#000000"><font color="#0000bb"><?php<br> <br> </font><font color="#ff8000">/*<br> <br> Zip file creation class<br> makes zip files on the fly...<br> <br> use the functions add_dir() and add_file() to build the zip file;<br> see example code below<br> <br> by Eric Mueller<br> http://www.themepark.com<br> <br> v1.1 9-20-01<br> - added comments to example<br> <br> v1.0 2-5-01<br> <br> initial version with:<br> - class appearance<br> - add_file() and file() methods<br> - gzcompress() output hacking<br> by Denis O.Philippov, [email protected], http://www.atlant.ru<br> <br> */<br> <br> // official ZIP file format: http://www.pkware.com/appnote.txt<br> <br> </font><font color="#007700">class </font><font color="#0000bb">zipfile <br> </font><font color="#007700">{ <br> <br> var </font><font color="#0000bb">$datasec </font><font color="#007700">= array(); </font><font color="#ff8000">// array to store compressed data<br> </font><font color="#007700">var </font><font color="#0000bb">$ctrl_dir </font><font color="#007700">= array(); </font><font color="#ff8000">// central directory <br> </font><font color="#007700">var </font><font color="#0000bb">$eof_ctrl_dir </font><font color="#007700">= </font><font color="#dd0000">"\x50\x4b\x05\x06\x00\x00\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">//end of Central directory record<br> </font><font color="#007700">var </font><font color="#0000bb">$old_offset </font><font color="#007700">= </font><font color="#0000bb">0</font><font color="#007700">;<br> <br> function </font><font color="#0000bb">add_dir</font><font color="#007700">(</font><font color="#0000bb">$name</font><font color="#007700">) <br> <br> </font><font color="#ff8000">// adds "directory" to archive - do this before putting any files in directory!<br> // $name - name of directory... like this: "path/"<br> // ...then you can add files using add_file with names like "path/file.txt"<br> </font><font color="#007700">{ <br> </font><font color="#0000bb">$name </font><font color="#007700">= </font><font color="#0000bb">str_replace</font><font color="#007700">(</font><font color="#dd0000">"\\"</font><font color="#007700">, </font><font color="#dd0000">"/"</font><font color="#007700">, </font><font color="#0000bb">$name</font><font color="#007700">); <br> <br> </font><font color="#0000bb">$fr </font><font color="#007700">= </font><font color="#dd0000">"\x50\x4b\x03\x04"</font><font color="#007700">;<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x0a\x00"</font><font color="#007700">; </font><font color="#ff8000">// ver needed to extract<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// gen purpose bit flag<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// compression method<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x00\x00\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// last mod time and date<br> <br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">); </font><font color="#ff8000">// crc32<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">); </font><font color="#ff8000">//compressed filesize<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">); </font><font color="#ff8000">//uncompressed filesize<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$name</font><font color="#007700">) ); </font><font color="#ff8000">//length of pathname<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//extra field length<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">$name</font><font color="#007700">; <br> </font><font color="#ff8000">// end of "local file header" segment<br> <br> // no "file data" segment for path<br> <br> // "data descriptor" segment (optional but necessary if archive is not served as file)<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$crc</font><font color="#007700">); </font><font color="#ff8000">//crc32<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$c_len</font><font color="#007700">); </font><font color="#ff8000">//compressed filesize<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$unc_len</font><font color="#007700">); </font><font color="#ff8000">//uncompressed filesize<br> <br> // add this entry to array<br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">datasec</font><font color="#007700">[] = </font><font color="#0000bb">$fr</font><font color="#007700">;<br> <br> </font><font color="#0000bb">$new_offset </font><font color="#007700">= </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">implode</font><font color="#007700">(</font><font color="#dd0000">""</font><font color="#007700">, </font><font color="#0000bb">$this</font><font color="#007700">-></font><font color="#0000bb">datasec</font><font color="#007700">));<br> <br> </font><font color="#ff8000">// ext. file attributes mirrors MS-DOS directory attr byte, detailed<br> // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp<br> <br> // now add to central record<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">= </font><font color="#dd0000">"\x50\x4b\x01\x02"</font><font color="#007700">;<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// version made by<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x0a\x00"</font><font color="#007700">; </font><font color="#ff8000">// version needed to extract<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// gen purpose bit flag<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// compression method<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// last mod time & date<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">); </font><font color="#ff8000">// crc32<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">); </font><font color="#ff8000">//compressed filesize<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">); </font><font color="#ff8000">//uncompressed filesize<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$name</font><font color="#007700">) ); </font><font color="#ff8000">//length of filename<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//extra field length <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//file comment length<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//disk number start<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//internal file attributes<br> </font><font color="#0000bb">$ext </font><font color="#007700">= </font><font color="#dd0000">"\x00\x00\x10\x00"</font><font color="#007700">;<br> </font><font color="#0000bb">$ext </font><font color="#007700">= </font><font color="#dd0000">"\xff\xff\xff\xff"</font><font color="#007700">; <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">, </font><font color="#0000bb">16 </font><font color="#007700">); </font><font color="#ff8000">//external file attributes - 'directory' bit set<br> <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">, </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">old_offset </font><font color="#007700">); </font><font color="#ff8000">//relative offset of local header<br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">old_offset </font><font color="#007700">= </font><font color="#0000bb">$new_offset</font><font color="#007700">;<br> <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">$name</font><font color="#007700">; <br> </font><font color="#ff8000">// optional extra field, file comment goes here<br> // save to array<br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">ctrl_dir</font><font color="#007700">[] = </font><font color="#0000bb">$cdrec</font><font color="#007700">; <br> <br> <br> }<br> <br> <br> function </font><font color="#0000bb">add_file</font><font color="#007700">(</font><font color="#0000bb">$data</font><font color="#007700">, </font><font color="#0000bb">$name</font><font color="#007700">) <br> <br> </font><font color="#ff8000">// adds "file" to archive <br> // $data - file contents<br> // $name - name of file in archive. Add path if your want<br> <br> </font><font color="#007700">{ <br> </font><font color="#0000bb">$name </font><font color="#007700">= </font><font color="#0000bb">str_replace</font><font color="#007700">(</font><font color="#dd0000">"\\"</font><font color="#007700">, </font><font color="#dd0000">"/"</font><font color="#007700">, </font><font color="#0000bb">$name</font><font color="#007700">); <br> </font><font color="#ff8000">//$name = str_replace("\\", "\\\\", $name);<br> <br> </font><font color="#0000bb">$fr </font><font color="#007700">= </font><font color="#dd0000">"\x50\x4b\x03\x04"</font><font color="#007700">;<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x14\x00"</font><font color="#007700">; </font><font color="#ff8000">// ver needed to extract<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// gen purpose bit flag<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x08\x00"</font><font color="#007700">; </font><font color="#ff8000">// compression method<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#dd0000">"\x00\x00\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// last mod time and date<br> <br> </font><font color="#0000bb">$unc_len </font><font color="#007700">= </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$data</font><font color="#007700">); <br> </font><font color="#0000bb">$crc </font><font color="#007700">= </font><font color="#0000bb">crc32</font><font color="#007700">(</font><font color="#0000bb">$data</font><font color="#007700">); <br> </font><font color="#0000bb">$zdata </font><font color="#007700">= </font><font color="#0000bb">gzcompress</font><font color="#007700">(</font><font color="#0000bb">$data</font><font color="#007700">); <br> </font><font color="#0000bb">$zdata </font><font color="#007700">= </font><font color="#0000bb">substr</font><font color="#007700">( </font><font color="#0000bb">substr</font><font color="#007700">(</font><font color="#0000bb">$zdata</font><font color="#007700">, </font><font color="#0000bb">0</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$zdata</font><font color="#007700">) - </font><font color="#0000bb">4</font><font color="#007700">), </font><font color="#0000bb">2</font><font color="#007700">); </font><font color="#ff8000">// fix crc bug<br> </font><font color="#0000bb">$c_len </font><font color="#007700">= </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$zdata</font><font color="#007700">); <br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$crc</font><font color="#007700">); </font><font color="#ff8000">// crc32<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$c_len</font><font color="#007700">); </font><font color="#ff8000">//compressed filesize<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$unc_len</font><font color="#007700">); </font><font color="#ff8000">//uncompressed filesize<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$name</font><font color="#007700">) ); </font><font color="#ff8000">//length of filename<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//extra field length<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">$name</font><font color="#007700">; <br> </font><font color="#ff8000">// end of "local file header" segment<br> <br> // "file data" segment<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">$zdata</font><font color="#007700">; <br> <br> </font><font color="#ff8000">// "data descriptor" segment (optional but necessary if archive is not served as file)<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$crc</font><font color="#007700">); </font><font color="#ff8000">//crc32<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$c_len</font><font color="#007700">); </font><font color="#ff8000">//compressed filesize<br> </font><font color="#0000bb">$fr </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$unc_len</font><font color="#007700">); </font><font color="#ff8000">//uncompressed filesize<br> <br> // add this entry to array<br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">datasec</font><font color="#007700">[] = </font><font color="#0000bb">$fr</font><font color="#007700">;<br> <br> </font><font color="#0000bb">$new_offset </font><font color="#007700">= </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">implode</font><font color="#007700">(</font><font color="#dd0000">""</font><font color="#007700">, </font><font color="#0000bb">$this</font><font color="#007700">-></font><font color="#0000bb">datasec</font><font color="#007700">));<br> <br> </font><font color="#ff8000">// now add to central directory record<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">= </font><font color="#dd0000">"\x50\x4b\x01\x02"</font><font color="#007700">;<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// version made by<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x14\x00"</font><font color="#007700">; </font><font color="#ff8000">// version needed to extract<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// gen purpose bit flag<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x08\x00"</font><font color="#007700">; </font><font color="#ff8000">// compression method<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.=</font><font color="#dd0000">"\x00\x00\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// last mod time & date<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$crc</font><font color="#007700">); </font><font color="#ff8000">// crc32<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$c_len</font><font color="#007700">); </font><font color="#ff8000">//compressed filesize<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">,</font><font color="#0000bb">$unc_len</font><font color="#007700">); </font><font color="#ff8000">//uncompressed filesize<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$name</font><font color="#007700">) ); </font><font color="#ff8000">//length of filename<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//extra field length <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//file comment length<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//disk number start<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">0 </font><font color="#007700">); </font><font color="#ff8000">//internal file attributes<br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">, </font><font color="#0000bb">32 </font><font color="#007700">); </font><font color="#ff8000">//external file attributes - 'archive' bit set<br> <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">, </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">old_offset </font><font color="#007700">); </font><font color="#ff8000">//relative offset of local header<br> // echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";<br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">old_offset </font><font color="#007700">= </font><font color="#0000bb">$new_offset</font><font color="#007700">;<br> <br> </font><font color="#0000bb">$cdrec </font><font color="#007700">.= </font><font color="#0000bb">$name</font><font color="#007700">; <br> </font><font color="#ff8000">// optional extra field, file comment goes here<br> // save to central directory<br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">ctrl_dir</font><font color="#007700">[] = </font><font color="#0000bb">$cdrec</font><font color="#007700">; <br> }<br> <br> function </font><font color="#0000bb">file</font><font color="#007700">() { </font><font color="#ff8000">// dump out file <br> </font><font color="#0000bb">$data </font><font color="#007700">= </font><font color="#0000bb">implode</font><font color="#007700">(</font><font color="#dd0000">""</font><font color="#007700">, </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">datasec</font><font color="#007700">); <br> </font><font color="#0000bb">$ctrldir </font><font color="#007700">= </font><font color="#0000bb">implode</font><font color="#007700">(</font><font color="#dd0000">""</font><font color="#007700">, </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">ctrl_dir</font><font color="#007700">); <br> <br> return <br> </font><font color="#0000bb">$data</font><font color="#007700">. <br> </font><font color="#0000bb">$ctrldir</font><font color="#007700">. <br> </font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">eof_ctrl_dir</font><font color="#007700">. <br> </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">ctrl_dir</font><font color="#007700">)). </font><font color="#ff8000">// total # of entries "on this disk"<br> </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"v"</font><font color="#007700">, </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">$this </font><font color="#007700">-> </font><font color="#0000bb">ctrl_dir</font><font color="#007700">)). </font><font color="#ff8000">// total # of entries overall<br> </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$ctrldir</font><font color="#007700">)). </font><font color="#ff8000">// size of central dir<br> </font><font color="#0000bb">pack</font><font color="#007700">(</font><font color="#dd0000">"V"</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">$data</font><font color="#007700">)). </font><font color="#ff8000">// offset to start of central dir<br> </font><font color="#dd0000">"\x00\x00"</font><font color="#007700">; </font><font color="#ff8000">// .zip file comment length<br> </font><font color="#007700">}<br> } <br> <br> </font><font color="#0000bb">?></font> </font></code></p> </blockquote> <p><code><font size="2" face="Arial" color="#000000"><b>Example Usage of the Class</b></font></code></p> <blockquote> <p><code><font color="#000000"><font color="#0000bb"><?php<br> <br> $zipfile </font><font color="#007700">= new </font><font color="#0000bb">zipfile</font><font color="#007700">(); <br> <br> </font><font color="#ff8000">// add the subdirectory ... important!<br> </font><font color="#0000bb">$zipfile </font><font color="#007700">-> </font><font color="#0000bb">add_dir</font><font color="#007700">(</font><font color="#dd0000">"dir/"</font><font color="#007700">);<br> <br> </font><font color="#ff8000">// add the binary data stored in the string 'filedata'<br> </font><font color="#0000bb">$filedata </font><font color="#007700">= </font><font color="#dd0000">"(read your file into $filedata)"</font><font color="#007700">; <br> </font><font color="#0000bb">$zipfile </font><font color="#007700">-> </font><font color="#0000bb">add_file</font><font color="#007700">(</font><font color="#0000bb">$filedata</font><font color="#007700">, </font><font color="#dd0000">"dir/file.txt"</font><font color="#007700">); <br> <br> </font><font color="#ff8000">// the next three lines force an immediate download of the zip file:<br> </font><font color="#0000bb">header</font><font color="#007700">(</font><font color="#dd0000">"Content-type: application/octet-stream"</font><font color="#007700">); <br> </font><font color="#0000bb">header</font><font color="#007700">(</font><font color="#dd0000">"Content-disposition: attachment; filename=test.zip"</font><font color="#007700">); <br> echo </font><font color="#0000bb">$zipfile </font><font color="#007700">-> </font><font color="#0000bb">file</font><font color="#007700">(); <br> <br> <br> </font><font color="#ff8000">// OR instead of doing that, you can write out the file to the loca disk like this:<br> </font><font color="#0000bb">$filename </font><font color="#007700">= </font><font color="#dd0000">"output.zip"</font><font color="#007700">;<br> </font><font color="#0000bb">$fd </font><font color="#007700">= </font><font color="#0000bb">fopen </font><font color="#007700">(</font><font color="#0000bb">$filename</font><font color="#007700">, </font><font color="#dd0000">"wb"</font><font color="#007700">);<br> </font><font color="#0000bb">$out </font><font color="#007700">= </font><font color="#0000bb">fwrite </font><font color="#007700">(</font><font color="#0000bb">$fd</font><font color="#007700">, </font><font color="#0000bb">$zipfile </font><font color="#007700">-> </font><font color="#0000bb">file</font><font color="#007700">());<br> </font><font color="#0000bb">fclose </font><font color="#007700">(</font><font color="#0000bb">$fd</font><font color="#007700">);<br> <br> </font><font color="#ff8000">// then offer it to the user to download:<br> </font><font color="#007700"><</font><font color="#0000bb">a href</font><font color="#007700">=</font><font color="#dd0000">"output.zip"</font><font color="#007700">></font><font color="#0000bb">Click here to download the </font><font color="#007700">new </font><font color="#0000bb">zip file</font><font color="#007700">.</</font><font color="#0000bb">a</font><font color="#007700">><br> <br> </font><font color="#0000bb">?></font></font></code></p> <p> </p> </blockquote>
التعليقات الأصلية (3)
مسترجع من Wayback Machine