[PHP] Zip archiv erstellen

Dieses Thema im Forum "Webentwicklung" wurde erstellt von GaYlORd, 23. November 2008 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 23. November 2008
    Zip archiv erstellen

    Servus!

    Ich hab dieses script:
    PHP:
    <? php

    $zip 
    = new  ZipArchive ;
    if (
    $zip -> open ( '/archive/{$_GET["name"]}.zip' ZipArchive :: CREATE ) ===  TRUE ) {
    $db  = @new  mysqli ( 'zugangsdaten' );
    if (
    mysqli_connect_errno ()) {
        die (
    'Konnte keine Verbindung zur Datenbank aufbauen: ' . mysqli_connect_error (). '(' . mysqli_connect_errno (). ')' );
    }
        
    $gal  $_GET [ "name" ];
        
    $sql     =     "SELECT Pfad FROM `bild` WHERE Name=' { $gal } ' ORDER BY id ASC" ;
        
    $result  $db -> query ( $sql );
        if (!
    $result ) {
        die (
    'Etwas stimmte mit dem Query nicht: ' . $db -> error );
    }
    while (
    $row  $result -> fetch_assoc ()) {  

    $pf  $row [ 'Pfad' ];
    $zip -> addFile ( '{$pf}' );
    }
    $result -> close ();
    unset(
    $result );

    echo 
    "<a href=\"" . $_GET [ "name" ]. ".zip\">KLICK</a>" ;
    $zip -> close ();
    }
    else {
        echo 
    'Fehler' ;
    }
    ?>

    Nur leider erstellt er mir mein Zip archiv nicht^^
    Es kommen keinerlei fehler, etc...
    Hat wer ne idee, warum?

    gruß
    gl
     
  2. 23. November 2008
    AW: Zip archiv erstellen

    welche klasse benutzt du um das archiv zu erstellen?!
     
  3. 23. November 2008
    AW: Zip archiv erstellen

    Meinst du das:
    ?
     
  4. 23. November 2008
    AW: Zip archiv erstellen

    nein, er meint wo du die klasse ZipArchive her hast
    das ist keine offizielle php klasse so weit ich weiß
     
  5. 23. November 2008
    AW: Zip archiv erstellen

    von da: PHP: Beispiele - Manual
     
  6. 23. November 2008
    AW: Zip archiv erstellen

    Vielleicht liegts daran?
     
  7. 23. November 2008
    AW: Zip archiv erstellen

    hm, also ordner hat schreibrechte.

    ich habs grad so versucht dass ich diese zip datei mit fopen erstellen lasse und dann die datein nur noch hinzufüge. Kam aber auch kein ergebnis raus.


    gibts vllt. ne andere Methode ein Archiv erstellen zulassen?

    gruß
    gl
     
  8. 23. November 2008
    AW: Zip archiv erstellen

    Ich weiß nicht, ob es reicht, dass der Ordner Schreibrechte hat. Gib mal der PHP-Datei direkt Schreibrechte und schau, obs dann funktioniert.
     
  9. 23. November 2008
    AW: Zip archiv erstellen

    ne, da passiert auch nicht mehr
     
  10. 23. November 2008
    AW: Zip archiv erstellen

    probiers mal mit:
    PHP:
    if ( $zip -> open ( 'archive/.......' );
    bzw.

    PHP:
    if ( $zip -> open ( './archive/....' );
    "/archive/" wäre vom root-dir aus gesehen (wenn ich mich nicht irre)... kenne deine ordnerstruktur nicht, aber eigentlich kann es nur daran hängen...
     
  11. 23. November 2008
    AW: Zip archiv erstellen

    ne, funzt beides auch nicht :'(

    Aber er muss es ja schaffen, wenigstens die .zip datei zu erstellen. Ob mit oder ohne inhalt wär mir im moment auch egal^^

    -----edit:

    ok, hab jetzt was funktionierendes gefunden!

    und zwar http://www.wunsch-software.at/artikel_php_zip.php
    das macht eine art "on-the-fly-zip".
    Also er speichert sie nur temporär und die datei wird glei zum Download gezwungen

    Edit2: Geht wohl doch nicht.
    Er speicher mir jetzt nur die DAteinamen, aber ohne inhalt^^

    Edit3: Funktioniert doch. und zwar mit file_get_contents().
    Problem jetzt ist, dass nach 30sec vom server aus abgebrochen wird.
    Code:
    Fatal error: Maximum execution time of 30 seconds exceeded in /usr/home/....
    
    Habs jetzt so gelöst, dass ich es erst aufm webspace nach jedem bild speichern lasse.
    ---------
    Komisch.
    Jetzt speicherts er, aber wenn ich das zip-archiv runtergeladen habe, ist dadrin nur ein bild, welches ich nich öffnen kann.

    Aber das Gesamte Archiv hat die richtige größe!! :/

    Hier mal mein Versuch:

    PHP:
    <? php

        
    // official ZIP file format: http://www. // pkware.com/appnote.txt
        
    class  zipfile  
        
    {  

            var 
    $datasec  = array();  // array to store compressed data
            
    var  $ctrl_dir  = array();  // central directory   
            
    var  $eof_ctrl_dir  "\x50\x4b\x05\x06\x00\x00\x00\x00" //end of Central directory record
            
    var  $old_offset  0 ;

            function 
    add_dir ( $name )   

            
    // adds "directory" to archive - do this before putting any files in directory!
            // $name - name of directory... like this: "path/"
            // ...then you can add files using add_file with names like "path/file.txt"
            
    {  
                
    $name  str_replace ( "\\" "/" $name );  

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

                
    $fr  .=  pack ( "V" , 0 );  // crc32
                
    $fr  .=  pack ( "V" , 0 );  //compressed filesize
                
    $fr  .=  pack ( "V" , 0 );  //uncompressed filesize
                
    $fr  .=  pack ( "v" strlen ( $name ) );  //length of pathname
                
    $fr  .=  pack ( "v" );  //extra field length
                
    $fr  .=  $name ;  
                
    // end of "local file header" segment

                // no "file data" segment for path

                // "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 ));

                
    // ext. file attributes mirrors MS-DOS directory attr byte, detailed
                // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp

                // now add to central record
                
    $cdrec  "\x50\x4b\x01\x02" ;
                
    $cdrec  .= "\x00\x00" ;     // version made by
                
    $cdrec  .= "\x0a\x00" ;     // version needed to extract
                
    $cdrec  .= "\x00\x00" ;     // gen purpose bit flag
                
    $cdrec  .= "\x00\x00" ;     // compression method
                
    $cdrec  .= "\x00\x00\x00\x00" // last mod time & date
                
    $cdrec  .=  pack ( "V" , 0 );  // crc32
                
    $cdrec  .=  pack ( "V" , 0 );  //compressed filesize
                
    $cdrec  .=  pack ( "V" , 0 );  //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
                
    $ext  "\x00\x00\x10\x00" ;
                
    $ext  "\xff\xff\xff\xff" ;  
                
    $cdrec  .=  pack ( "V" 16  );  //external file attributes  - 'directory' 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 array
                
    $this  ->  ctrl_dir [] =  $cdrec ;  

                 
            }


            function 
    add_file ( $data $name )   

            
    // adds "file" to archive   
            // $data - file contents
            // $name - name of file in archive. Add path if your want

            
    {  
                
    $name  str_replace ( "\\" "/" $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

                
    $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" );  //extra field length
                
    $fr  .=  $name ;  
                
    // end of "local file header" segment
                 
                // "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
        //      &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";
                
    $this  ->  old_offset  $new_offset ;

                
    $cdrec  .=  $name ;  
                
    // optional extra field, file comment goes here
                // save to central directory
                
    $this  ->  ctrl_dir [] =  $cdrec ;  
            }

            function 
    file () {  // dump out 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
            
    }
        }  
    $gal  $_GET [ "gal" ];   
    if (!
    file_exists ( "archive/" . $gal . ".zip" )){
    $db  = @new  mysqli ( 'sdfsdf' );
    if (
    mysqli_connect_errno ()) {
        die (
    'Konnte keine Verbindung zur Datenbank aufbauen: ' . mysqli_connect_error (). '(' . mysqli_connect_errno (). ')' );
    }
        
    $sql     =     "SELECT Pfad, Bildname FROM `bild` WHERE Name=' { $gal } ' ORDER BY id ASC" ;
        
    $result  $db -> query ( $sql );
        if (!
    $result ) {
        die (
    'Etwas stimmte mit dem Query nicht: ' . $db -> error );
    }
    $file = "archive/" . $gal . ".zip" ;
    $zipfile2  fopen  ( $file "w+" );
    while (
    $row  $result -> fetch_assoc ()) {  
    $zipfile  = new  zipfile (); 
    $filedata  "." . $row [ "Pfad" ];
    $zipfile  ->  add_file ( file_get_contents ( $filedata ),  $row [ "Bildname" ]); 
    fwrite ( $zipfile2 , $zipfile -> file ()); 
    }
    }

    ?>
    Hat wer ne Idee?
     
  12. 24. November 2008
    AW: Zip archiv erstellen

    soo, jetzt gehts.
    musste zwar das timeout hochsetzen, aber is ja egal, weil das eh nur beim ersten betrachter neu erstellt wird.

    hier mal das komplette funktionierende script:

    PHP:
    <? php
    ini_set
    ( 'max_execution_time' , '6000' );
        
    // official ZIP file format: http://www. // pkware.com/appnote.txt
        
    class  zipfile  
        
    {  

            var 
    $datasec  = array();  // array to store compressed data
            
    var  $ctrl_dir  = array();  // central directory   
            
    var  $eof_ctrl_dir  "\x50\x4b\x05\x06\x00\x00\x00\x00" //end of Central directory record
            
    var  $old_offset  0 ;

            function 
    add_dir ( $name )   

            
    // adds "directory" to archive - do this before putting any files in directory!
            // $name - name of directory... like this: "path/"
            // ...then you can add files using add_file with names like "path/file.txt"
            
    {  
                
    $name  str_replace ( "\\" "/" $name );  

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

                
    $fr  .=  pack ( "V" , 0 );  // crc32
                
    $fr  .=  pack ( "V" , 0 );  //compressed filesize
                
    $fr  .=  pack ( "V" , 0 );  //uncompressed filesize
                
    $fr  .=  pack ( "v" strlen ( $name ) );  //length of pathname
                
    $fr  .=  pack ( "v" );  //extra field length
                
    $fr  .=  $name ;  
                
    // end of "local file header" segment

                // no "file data" segment for path

                // "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 ));

                
    // ext. file attributes mirrors MS-DOS directory attr byte, detailed
                // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp

                // now add to central record
                
    $cdrec  "\x50\x4b\x01\x02" ;
                
    $cdrec  .= "\x00\x00" ;     // version made by
                
    $cdrec  .= "\x0a\x00" ;     // version needed to extract
                
    $cdrec  .= "\x00\x00" ;     // gen purpose bit flag
                
    $cdrec  .= "\x00\x00" ;     // compression method
                
    $cdrec  .= "\x00\x00\x00\x00" // last mod time & date
                
    $cdrec  .=  pack ( "V" , 0 );  // crc32
                
    $cdrec  .=  pack ( "V" , 0 );  //compressed filesize
                
    $cdrec  .=  pack ( "V" , 0 );  //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
                
    $ext  "\x00\x00\x10\x00" ;
                
    $ext  "\xff\xff\xff\xff" ;  
                
    $cdrec  .=  pack ( "V" 16  );  //external file attributes  - 'directory' 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 array
                
    $this  ->  ctrl_dir [] =  $cdrec ;  

                 
            }


            function 
    add_file ( $data $name )   

            
    // adds "file" to archive   
            // $data - file contents
            // $name - name of file in archive. Add path if your want

            
    {  
                
    $name  str_replace ( "\\" "/" $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

                
    $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" );  //extra field length
                
    $fr  .=  $name ;  
                
    // end of "local file header" segment
                 
                // "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
        //      &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";
                
    $this  ->  old_offset  $new_offset ;

                
    $cdrec  .=  $name ;  
                
    // optional extra field, file comment goes here
                // save to central directory
                
    $this  ->  ctrl_dir [] =  $cdrec ;  
            }

            function 
    file () {  // dump out 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
            
    }
        }  
    $gal  $_GET [ "gal" ];   
    if (!
    file_exists ( "archive/" . $gal . ".zip" )){
    $db  = @new  mysqli ( 'sfdsadasda' );
    if (
    mysqli_connect_errno ()) {
        die (
    'Konnte keine Verbindung zur Datenbank aufbauen: ' . mysqli_connect_error (). '(' . mysqli_connect_errno (). ')' );
    }
        
    $sql     =     "SELECT Pfad, Bildname FROM `bild` WHERE Name=' { $gal } ' ORDER BY id ASC" ;
        
    $result  $db -> query ( $sql );
        if (!
    $result ) {
        die (
    'Etwas stimmte mit dem Query nicht: ' . $db -> error );
    }
    $file = "archive/" . $gal . ".zip" ;
    $zipfile  = new  zipfile (); 
    while (
    $row  $result -> fetch_assoc ()) {
    $zipfile2  fopen  ( $file "wb" );
    $filedata  "." . $row [ "Pfad" ];
    $zipfile  ->  add_file ( file_get_contents ( $filedata ),  $row [ "Bildname" ]); 
    $s  $zipfile -> file ();
    fwrite ( $zipfile2 , $s ); 
    fclose ( $zipfile2 ); 
    }
    }

    ?>
     
  13. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.