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
Resumen de IA: 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.
Código fuente
<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, webmaster@atlant.ru, 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>
Upload
Comentarios originales (3)
Recuperado de Wayback Machine