Zip & Split Class liefert defekte Datei

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zip & Split Class liefert defekte Datei

    Hallo Leute,

    ich bastel gerade daran, Dateien vom Webspace in mehrere klein ZIP-Dateien zu packen. Dazu habe ich eine Class gefunden. Soweit funktioniert der Erzeugen ganz gut, allerdings lassen sich die ZIP-Dateien auf einem Windows System nicht öffnen. Habe schon daran rumgebastelt, komme aber überhaupt nicht weiter. Vielleicht hat jemand den zündenden Gedanke

    PHP-Code:
    /**  * EasyZIP class version 1.0 stable   * replacement for class.filesplitter.php  * 14 October 2004  * zip & split on the fly   * Author: huda m elmatsani  * Email : justhuda ## netscape ## net  *  *  * example  * create zip file  * $z = new EasyZIP;  * $z -> addFile("map.bmp");  * $z -> addFile("guide.pdf");  * $z -> addDir("files/test");  * $z -> zipFile("xyz.zip");  *  * created splitted file  * $z = new EasyZIP;  * $z -> addFile("guide.pdf");  * $z -> splitFile("map.zip",1048576);  *   * pack and split  * $z = new EasyZIP;  * $z -> addFile("map.bmp");  * $z -> addFile("guide.pdf");  * $z -> splitFile("xyz.zip",1048576);  *  *  */    //simple error message definition  define(FUNCTION_NOT_FOUND,'Error: gzcompress() function is not found');  define(FILE_NOT_FOUND,'Error: file is not found');  define(DIRECTORY_NOT_FOUND,'Error: directory is not found');    class EasyZIP {  var $filelist = array();  var $data_segments = array();  var $data_block;  var $file_headers = array();  var $filename;  var $filedata;  var $old_offset = 0;  var $splitted = 0;  var $split_signature = "";  var $split_size = 1;  var $split_offset = 0;  var $disk_number = 1;    function EasyZIP() {  if (!@function_exists('gzcompress')) die(FUNCTION_NOT_FOUND);  }    function addFile($filename) {  if(file_exists($filename)) {    $this -> filelist[] = str_replace('\\', '/', $filename);    } else {  die(FILE_NOT_FOUND);  }  }    function addDir($dirname) {  if ($handle = opendir($dirname)) {     while (false !== ($filename = readdir($handle))) {   if ($filename != "." && $filename != "..")   $this->addFile($dirname . '/' . $filename);  }     closedir($handle);   } else {  die(DIRECTORY_NOT_FOUND);  }  }      function zipFile($zipfilename) {  $zip = $this -> packFiles();  $fp = fopen($zipfilename, "w");  fwrite($fp, $zip, strlen($zip));  fclose($fp);  }     function splitFile($splitfilename, $chunk_size) {    $this -> chunk_size = $chunk_size;  $this -> splitted = 1;  $this -> split_offset = 4;  $this -> old_offset = $this -> split_offset;  $this -> split_signature = "\x50\x4b\x07\x08";    $zip = $this -> packFiles();    $out = $this -> str_split($this -> split_signature . $zip, $chunk_size);    for ($i = 0; $i < sizeof($out); $i++){  if($i < sizeof($out)-1) {  $sfilename = basename ($splitfilename,".zip");   $sfilename = $sfilename . ".z" . sprintf("%02d",$i+1);  }  else $sfilename = $splitfilename;  $fp = fopen($sfilename, "w");  fwrite($fp, $out[$i], strlen($out[$i]));  fclose($fp);  }    }        function packFiles() {    foreach($this -> filelist as $k => $filename) {  $this -> filename = $filename;  $this -> setFileData();  $this -> setLocalFileHeader();  $this -> setDataDescriptor();  $this -> setDataSegment();  $this -> setFileHeader();  }  return $this -> getDataSegments() .   $this -> getCentralDirectory();    }    function setFileData() {  clearstatcache();  $fd = fopen ($this->filename, "rb");  $this->filedata = fread ($fd, filesize ($this->filename));  fclose ($fd);  $filetime = filectime($this->filename);  $this -> DOSFileTime($filetime);    }    function setLocalFileHeader() {    $local_file_header_signature = "\x50\x4b\x03\x04";//4 bytes (0x04034b50)  $this -> version_needed_to_extract = "\x14\x00"; //2 bytes  $this -> general_purpose_bit_flag = "\x00\x00"; //2 bytes  $this -> compression_method = "\x08\x00"; //2 bytes  $this -> crc_32 = pack('V', crc32($this -> filedata));// 4 bytes  //compressing data  $c_data = gzcompress($this -> filedata);  $this->compressed_filedata = substr(substr($c_data, 0, strlen($c_data) - 4), 2); // fix crc bug    $this -> compressed_size = pack('V', strlen($this -> compressed_filedata));// 4 bytes  $this -> uncompressed_size = pack('V', strlen($this -> filedata));//4 bytes  $this -> filename_length = pack('v', strlen($this -> filename));// 2 bytes  $this -> extra_field_length = pack('v', 0); //2 bytes    $this -> local_file_header = $local_file_header_signature .  $this -> version_needed_to_extract .  $this -> general_purpose_bit_flag .  $this -> compression_method .  $this -> last_mod_file_time .  $this -> last_mod_file_date .  $this -> crc_32 .  $this -> compressed_size .  $this -> uncompressed_size .  $this -> filename_length .  $this -> extra_field_length .  $this -> filename;      }    function setDataDescriptor() {    $this -> data_descriptor = $this->crc_32 . //4 bytes  $this -> compressed_size . //4 bytes  $this -> uncompressed_size; //4 bytes  }    function setDataSegment() {    $this -> data_segments[] = $this -> local_file_header .   $this -> compressed_filedata .   $this -> data_descriptor;  $this -> data_block = implode('', $this -> data_segments);  }    function getDataSegments() {  return $this -> data_block;  }    function setFileHeader() {    $new_offset = strlen( $this -> split_signature . $this -> data_block );    $central_file_header_signature = "\x50\x4b\x01\x02";//4 bytes (0x02014b50)  $version_made_by = pack('v', 0); //2 bytes    $file_comment_length = pack('v', 0); //2 bytes  $disk_number_start = pack('v', $this -> disk_number - 1); //2 bytes  $internal_file_attributes = pack('v', 0); //2 bytes  $external_file_attributes = pack('V', 32); //4 bytes  $relative_offset_local_header = pack('V', $this -> old_offset); //4 bytes    if($this -> splitted) {  $this -> disk_number = ceil($new_offset/$this->chunk_size);  $this -> old_offset = $new_offset - ($this->chunk_size * ($this -> disk_number-1));  } else $this -> old_offset = $new_offset;    $this -> file_headers[] = $central_file_header_signature .  $version_made_by .  $this -> version_needed_to_extract .  $this -> general_purpose_bit_flag .  $this -> compression_method .  $this -> last_mod_file_time .  $this -> last_mod_file_date .  $this -> crc_32 .  $this -> compressed_size .  $this -> uncompressed_size .  $this -> filename_length .  $this -> extra_field_length .  $file_comment_length .  $disk_number_start .  $internal_file_attributes .  $external_file_attributes .  $relative_offset_local_header .  $this -> filename;  }    function getCentralDirectory() {  $this -> central_directory = implode('', $this -> file_headers);   return $this -> central_directory .   $this -> getEndCentralDirectory();  }    function getEndCentralDirectory() {    $zipfile_comment = "Compressed/Splitted by PHP EasyZIP";    if($this -> splitted) {  $data_len = strlen($this -> split_signature . $this -> data_block . $this -> central_directory);  $last_chunk_len = $data_len - floor($data_len / $this -> chunk_size) * $this -> chunk_size;  $this -> old_offset = $last_chunk_len - strlen($this -> central_directory);  }    $end_central_dir_signature = "\x50\x4b\x05\x06";//4 bytes (0x06054b50)  $number_this_disk = pack('v', $this->disk_number - 1);//2 bytes  $number_disk_start = pack('v', $this->disk_number - 1);// 2 bytes  $total_number_entries = pack('v', sizeof($this -> file_headers));//2 bytes  $total_number_entries_central = pack('v', sizeof($this -> file_headers));//2 bytes  $size_central_directory = pack('V', strlen($this -> central_directory)); //4 bytes    $offset_start_central = pack('V', $this -> old_offset); //4 bytes   $zipfile_comment_length = pack('v', strlen($zipfile_comment));//2 bytes    return $end_central_dir_signature .  $number_this_disk .  $number_disk_start .  $total_number_entries .  $total_number_entries_central .  $size_central_directory .  $offset_start_central .  $zipfile_comment_length .  $zipfile_comment;  }    function DOSFileTime($unixtime = 0) {  $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);    if ($timearray['year'] < 1980) {  $timearray['year'] = 1980;  $timearray['mon'] = 1;  $timearray['mday'] = 1;  $timearray['hours'] = 0;  $timearray['minutes'] = 0;  $timearray['seconds'] = 0;  }     $dostime = (($timearray['year'] - 1980) << 25) |   ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |  ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) |   ($timearray['seconds'] >> 1);    $dtime = dechex($dostime);  $hexdtime = '\x' . $dtime[6] . $dtime[7]  . '\x' . $dtime[4] . $dtime[5];    $hexddate = '\x' . $dtime[2] . $dtime[3]  . '\x' . $dtime[0] . $dtime[1];  eval('$hexdtime = "' . $hexdtime . '";');  eval('$hexddate = "' . $hexddate . '";');    $this->last_mod_file_time = $hexdtime;  $this->last_mod_file_date = $hexddate;  }   function str_split($string, $length) {  for ($i = 0; $i < strlen($string); $i += $length) {  $array[] = substr($string, $i, $length);  }  return $array;  }    } 

  • #2
    ähhhhmmm....ich würd mal versuchen, den code in irgendeine syntaktische ordnung zu bringen, dann macht sich vllt auch jemand die arbeit sich das anzuschauen...

    da ich keine maus besitze, welche ein Seitlich-Scroll-Rad besitzt, werde ich das wohl auch ned machen...

    also..poste den code nochmal, aber sortiert, so dass man ihn lesen kann und gut ist...

    Lg, dennis
    Musik beflügelt unseren Geist

    Kommentar


    • #3


      was bin ich froh, dass ich die Scrolleiste direkt unterm Code habe und nicht im unteren Teil des Browserfensters...

      Viel Erfolg!

      *projekthilfe*

      Kommentar


      • #4
        OffTopic:
        was bin ich froh, dass ich die Scrolleiste direkt unterm Code habe und nicht im unteren Teil des Browserfensters...
        Möcht ich auch haben ~~
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          Dann erweiter mal deinen FF.

          Kommentar

          Lädt...
          X