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