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

Search the boards