Zip & Split Class liefert defekte Datei (die Zweite)

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

  • Zip & Split Class liefert defekte Datei (die Zweite)

    Hallo Leute,

    ich bastel gerade daran Dateien auf dem Webspace in mehrere Zip-Dateien zu packen. Bastel schon ein ganzes Stück dran, aber es will nicht gelingen. Zwar werden ZIP-Dateien erstellt. Aber diese lassen sich auf einem Windowssystem nicht öffnen. Vielleicht findet jemand die Ursache allen Übels

    PS: Vorhergehende Eintrag bitte löschen. Er wurde irgendwie zerschossen!

    <?php

    /**
    * 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
    Warum 2. Post

    "Nicht jeder Mensch kann und soll Programmieren[...]".

    Kommentar


    • #3
      Weil man eigentlich auch diesen Post gleich wegwerfen kann wenn jemand meint er müsse sich überhaupt nicht an die Regeln halten.
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #4
        sorry,

        aber beim ersten post hat es irgendwie mein post zerschossen....

        (Man siehe im ersten Post "PS: Vorhergehende Eintrag bitte löschen. Er wurde irgendwie zerschossen!")

        Kommentar


        • #5
          dann pack doch bitte noch deinen code sauber formatiert in php-tags.

          gruß
          peter
          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
          Meine Seite

          Kommentar


          • #6
            vielleicht kann mir aber jemand zu dem Problem helfen und es selbst mal testen. Nicht das ich Limits in der Serverkonfig überschreite (1&1).

            wenn ich mit der class aus einer 3,5 MB Zip mehrere 1 MB Splitfiles erstelle wird keine Datei geschrieben. Eine normale ZIP klappt und ich weiss nicht warum

            1,8 MB Files funktionieren wunderbar...


            PS: Für den Fall das die Class jemand nutzt. Beim öffnen mit 7-zip gibt es Probleme mit allen anderen Packern nicht... Daran hatte ich mich ewig aufgehalten
            Zuletzt geändert von joop; 23.09.2007, 18:49.

            Kommentar

            Lädt...
            X