Posted By: medvidek (Zase za polarnim kruhem) on 'CZscripts'
Title: PHP - vytvoreni zipu
Date: Fri Feb 15 16:12:18 2002
Tak uz jsem ten skript na vytvoreni ZIPu udelal. Presneji receno upravil jsem
jiz existujici dilo. Neni moc dlouhy, postnu ho sem, muzete ho aspon
zkritizovat, nejsem rozhodne php guru.
pouziva se to asi takhle:
$zip = new zipfile;
$zip->addFile ($content_of_the_file1, "file_name1", filemtime("file_name1"));
...
$zip->addFile ($content_of_the_fileN, "file_nameN", filemtime("file_nameN"));
$zip->finishArchive();
A slibene URL na fotky, ktere si muzete stahnout zazipovane timto skriptem:
http://gin2.itek.norut.no/~pavel/
a dal se doklikate
---
class zipfile
{
var $ctrl_dir = array();
var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
var $old_offset = 0;
function addFile($data, $name, $timestamp)
{
$name = str_replace('\', '/', $name);
$year = intval (date ("Y", $timestamp));
$month = intval (date ("n", $timestamp));
$day = intval (date ("j", $timestamp));
$hour = intval (date ("G", $timestamp));
$minute = intval (date ("i", $timestamp));
$second = intval (date ("s", $timestamp));
$msdostime = ($hour << 11) | ($minute << 5) | ($second/2);
$msdosdate = (($year - 1980) << 9) | ($month << 5) | $day;
$fr = "x50x4bx03x04";
$fr .= "x14x00"; // ver needed to extract
$fr .= "x00x00"; // gen purpose bit flag
$fr .= "x08x00"; // compression method
$fr .= pack('v', $msdostime); // last mod time
$fr .= pack('v', $msdosdate); // last mod date
// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;
// "file data" segment
$fr .= $zdata;
// "data descriptor" segment (optional but necessary if archive is not
// served as file)
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
// add this entry to array
//$this -> datasec[] = $fr;
echo $fr;
//$new_offset = strlen(implode('', $this->datasec));
$new_offset = $this->old_offset + strlen($fr);
// now add to central directory record
$cdrec = "x50x4bx01x02";
$cdrec .= "x00x00"; // version made by
$cdrec .= "x14x00"; // version needed to extract
$cdrec .= "x00x00"; // gen purpose bit flag
$cdrec .= "x08x00"; // compression method
$cdrec .= pack('v', $msdostime); // last mod time
$cdrec .= pack('v', $msdosdate); // last mod date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name) ); // length of filename
$cdrec .= pack('v', 0 ); // extra field length
$cdrec .= pack('v', 0 ); // file comment length
$cdrec .= pack('v', 0 ); // disk number start
$cdrec .= pack('v', 0 ); // internal file attributes
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set
$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
$this -> old_offset = $new_offset;
$cdrec .= $name;
// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
} // end of the 'addFile()' method
function finishArchive()
{
$ctrldir = implode('', $this -> ctrl_dir);
echo
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
//pack('V', strlen($data)) . // offset to start of central dir
pack('V', $this->old_offset) . // offset to start of central dir
"x00x00"; // .zip file comment length
}
} // end of the 'zipfile' class
medvidek
--
ELVIRA - Extended LSD VoiceXML interpreter for Applications
http://www.fi.muni.cz/lsd/elvira
Engine for building dialog applications Free for noncommercial use