[zip] und zapp die nase ab -> 5 byte zuviel

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

  • [zip] und zapp die nase ab -> 5 byte zuviel

    so. nun habe ich mich mal mit dem dynamischen erstellen von zip-dateien befasst. dazu habe ich diese class verwenden.

    aber ich würde nicht posten, wenn ich nicht dabei ein kleines problem festgestellt hätte...

    im beigefügten bild, kann man sehen, dass bei der datei logo.zip die html- und die gif-datei jeweils 5 byte größer in der komprimierung ist, als in der referenz logo_ref.zip, die ich einfach unter winblows als zip geschrieben habe.

    das ganze MUSS auch als unkomprimierten zip sein. nur falls jemand fragen sollte.

    die dynamisch erzeugte datei lässt sich auch wunderbar wieder extrahieren. nur warum zum teufel sind da immer 5 byte zuviel?

    anbei auch ein wenig code..

    PHP-Code:
    <?php

        
    include ($_SERVER['DOCUMENT_ROOT'].'/classes/archives.class.php');

        
    // echo '<pre>';
        // print_r($_POST);
        // print_r($_FILES);
        // echo '</pre>';

        
    if(isset($_POST['text'], $_FILES['bild']) && trim($_POST['text'])!='' && $_FILES['bild']['size']>)
        {
            
    // neues archiv erstellen.
            
    $flags = array('level' => 0); // keine kompression
            
    $zip = &new zipfile('./'$flags);

            
    // hochgeladene datei auslesen.
            
    $fp fopen($_FILES['bild']['tmp_name'], 'r');
            
    $data fread ($fp$_FILES['bild']['size']);
            
    fclose ($fp);

            
    // bilddatei ins zip eintragen.
            
    $zip->addfile($data$_FILES['bild']['name']);

            
    // neuen dateinamen ohne endung bestimmen.
            
    $dateiname substr($_FILES['bild']['name'], 0strrpos($_FILES['bild']['name'],'.'));

            
    $html '<IMG SRC="'.$_FILES['bild']['name'].'" />'.$_POST['text'];

            
    // htmldatei ins zip eintragen.
            
    $zip->addfile($html$dateiname.'.html');

            
    // download initiieren.
            
    $zip->filedownload($dateiname.'.zip');

            
    // script nach download beenden
            
    exit();
        }

        echo 
    '<form action="'.$_SERVER['PHP_SELF'].'" method="post" enctype="multipart/form-data">';

        echo 
    'bilddatei: <input type="file" name="bild"><br />';
        echo 
    'text: <input type="text" name="text" value=""><br />';

        echo 
    '<input type="submit" name="" value="senden">';

        echo 
    '</form>';

    ?>
    Angehängte Dateien
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |



  • #2
    Bloss geraten, vielleicht schreibt php eine art signatur "made by php" in die zip file? Warums dann in empackten drin ist.?
    Möglich ist alles!

    Kommentar


    • #3
      Öffne doch mal die Datein in einem text editor. Siehst du was?
      Möglich ist alles!

      Kommentar


      • #4
        Original geschrieben von timepoint5
        Öffne doch mal die Datein in einem text editor. Siehst du was?
        habe ich gerade gemacht, wie ich deinen anderen post gesehen habe...

        ich denke, dass ich die 5 byte identifiziert habe... siehe bild.

        nur woher kommen die ?
        Angehängte Dateien
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          anbei auch mal beide zip's in einem.....

          logo.zip -> aus php
          logo_ref.zip -> mit winzip
          Angehängte Dateien
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            hmm ... hab immer meine probleme mit dieser klasse gehabt.

            nachdem ich mit hilfe von phpMyAdmin mir was zurechtgestrickt habe,
            gehts auch mit dem zippen.

            habs gerade mal getestet filesize.ziplib = filesize.winzip ... zumindest
            bei mir.

            PHP-Code:
            <?php
            class zipfile
            {  
                var 
            $datasec      = array();
                var 
            $ctrl_dir     = array();
                var 
            $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00";
                var 
            $old_offset   0;


                function 
            addFile($data$name)
                {
                    
            $name str_replace('\\''/'$name);

                    
            $fr   "\x50\x4b\x03\x04"
                    
            $fr   .= "\x14\x00";            // ver needed to extract 
                    
            $fr   .= "\x00\x00";            // gen purpose bit flag 
                    
            $fr   .= "\x08\x00";            // compression method 
                    
            $fr   .= "\x00\x00\x00\x00";    // last mod time and date 

                    // "local file header" segment
                    
            $unc_len strlen($data);
                    
            $crc     crc32($data);
                    
            $zdata   gzcompress($data);
                    
            $zdata   substr(substr($zdata0strlen($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;
                    
            $new_offset        strlen(implode(''$this->datasec));

                    
            // now add to central directory record
                    
            $cdrec "\x50\x4b\x01\x02";
                    
            $cdrec .= "\x00\x00";                // version made by
                    
            $cdrec .= "\x14\x00";                // version needed to extract
                    
            $cdrec .= "\x00\x00";                // gen purpose bit flag
                    
            $cdrec .= "\x08\x00";                // compression method
                    
            $cdrec .= "\x00\x00\x00\x00";        // last mod time & 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');             // extra field length
                    
            $cdrec .= pack('v');             // file comment length
                    
            $cdrec .= pack('v');             // disk number start
                    
            $cdrec .= pack('v');             // 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


                /**
                 * Dumps out file
                 *
                 * @return  string  the zipped file
                 *
                 * @access public
                 */
                
            function file()
                {
                    
            $data    implode(''$this -> datasec);
                    
            $ctrldir implode(''$this -> ctrl_dir);

                    return
                        
            $data .
                        
            $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
                        
            "\x00\x00";                             // .zip file comment length
                
            // end of the 'file()' method

            // end of the 'zipfile' class
            ?>
            wenn ichs noch richtig in erinnerung habe, differieren die klassen in diesen
            bereichen "\x50\x4b\x05 ..." wo diese bit-flags gesetzt werden (oder so).
            da könnten sich auch deine 5 byte verstecken ... aber nagel' mich nicht
            drauf fest
            Kissolino.com

            Kommentar


            • #7
              ne. damit kann ich leider so spontan auch nichts anfangen, weil ja die komprimierung nicht dabei ist.... aber ich werde das dingens mal anpassen..... zumindest versuchen...

              was deine "\x50\x4b\x05 ..." betrifft, so habe ich in der berni-class nichts gefunden....
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                keine komprimierung (textdatei kompressionsrate 94%) wir
                reden aber schon über's selbe script ... aber du machst ja eh'
                was du willst
                Kissolino.com

                Kommentar


                • #9
                  nein. die komprimierung darf deshalb nicht sein, weil die zip später in ein anderes externes system rein muss. dort darf eben die zip keine kompression haben.....

                  so. ich habe nun das ganze mal mit dem schnippet von dir getestet. für die komprimierung habe ich nur diese zeile erweitert ...
                  PHP-Code:
                  $zdata   gzcompress($data$this->level); 
                  .... level habe ich auf 0 definiert (keine kompression).

                  auch hier habe ich 5 byte zuviel ...
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    *autsch* => 5 byte

                    wenn ich nen bischen rumspiele bekomme ich die dateigrösse so hin,
                    wie die ausgangsdatei. dann ist aber die gezippte datei im eimer

                    aber mit der winzip-fehlermeldung kannst du vielleicht was anfangen:
                    Extracting to "C:\WIN98\TEMP\"
                    Use Path: no Overlay Files: yes
                    For file "dummy.php", the time stamp in the central directory is invalid, using the current system time instead.
                    For file "dummy.php", the time stamp in the local directory is invalid, using the current system time instead.

                    Extracting dummy.php
                    Error: unexpected end of file encountered
                    Error: invalid compressed data to inflate
                    Kissolino.com

                    Kommentar


                    • #11
                      ne... mit der meldung kann ich leider nichts anfangen...

                      aber die 5 byte bei mir sind auch innerhalb der zip so angegeben.

                      wenn ich jetzt mal nur das bild nehme.

                      Code:
                      logo.gif     9.121  
                      logo.gif     9.121  (in zip)
                      logo.gif     9.126  (in zip komprimiert)
                      
                      logo.zip     9.252
                      irgendwie mag das mich nicht...
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        ich hab schon
                        - 2 falsche weg
                        - das publikum befragt und
                        - jemanden angerufen
                        ich nehm die kohle und steig aus
                        Kissolino.com

                        Kommentar


                        • #13
                          ich glaube, das mache ich auch...

                          muss mal suchen. von den zip-dingern gibt es ja bestimmt viele. auch werde ich das mal noch @home testen, wie es da läuft.
                          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                          Kommentar


                          • #14
                            auch wenn ich mit TBT's hilfe zwar ein datumsproblem in der bisherigen class lösen konnte, so war das erstellte zip-file leider nicht mehr für eine spezielle weiterverarbeitung gültig.

                            daher habe ich ein wenig improvisiert und eine class geschrieben, die das commandline tool 'zip' unter linux verwendet.

                            das ganze funktioniert nun wie gewünscht.

                            bei den codeschipseln könnt ihr mein werk bestaunen...
                            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                            Kommentar


                            • #15
                              mal ne blöde frage am rande:
                              die 5 byte tun an welcher stelle weh?
                              Kissolino.com

                              Kommentar

                              Lädt...
                              X