Ordner zippen aus unterschiedlichen Verzeichnissen

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

  • Ordner zippen aus unterschiedlichen Verzeichnissen

    Hallo an Alle,
    Gleich vorweg ich bin ein PHP-Script noob und Suche mir meine Problemlösungen aus dem Internet zusammen. Jetzt nach 2 Tagen suchen und Probieren brauch ich wirklich Hilfe.

    Folgendes: Ich habe ein Script gefunden mit dem ich eine einzele Datei und/oder den gesamten Inhalt eines Verzeichnisses Zippen kann.

    Jetzt die Frage wie müsste der Code geändert werden, wenn ich verschiedene Unterordner auf einmal zippen möchte?

    hier die Codes:

    zip.lib.php

    DeepDir.php
    PHP-Code:
    <?php

    //=========================================================
    // class "DeepDir" take files from all nested directories
    // Using:
    //
    //  $dirName = '..';
    //  $dir = new DeepDir();
    //  $dir->setDir( $dirName );
    //  $dir->load();
    //  foreach( $dir->files as $pathToFile ){
    //    echo $pathToFile."\n";
    //  }
    //

    class DeepDir{

      var 
    $dir;
      var 
    $files;

      function 
    DeepDir(){
        
    $this->dir '';
        
    $this->files = array();
        
    $this->dirFILO = new FILO();
      }

      function 
    setDir$dir ){
        
    $this->dir $dir;
        
    $this->files = array();
        
    $this->dirFILO->zero();
        
    $this->dirFILO->push$this->dir );
      }


      function 
    load(){
        while( 
    $this->curDir $this->dirFILO->pop() ){
          
    $this->loadFromCurDir();
        }
      }

      function 
    loadFromCurDir(){
        if ( 
    $handle = @opendir$this->curDir ) ){
          while ( 
    false !== ( $file readdir$handle ) ) ){
            if ( 
    $file == "." || $file == ".." ) continue;
            
    $filePath $this->curDir '/' $file;
            
    $fileType filetype$filePath );
            if ( 
    $fileType == 'dir' ){
              
    $this->dirFILO->push$filePath );
              continue;
            }
            
    $this->files[] = $filePath;
          }
          
    closedir$handle );
        }
        else{
          echo 
    'error open dir "'.$this->curDir.'"';
        }
      }

    // end class


    //================================
    // stack: First In Last Out
    //
    class FILO{

      var 
    $elements;
      
      function 
    FILO(){
        
    $this->zero();
      }

      function 
    push$elm ){
        
    array_push$this->elements$elm );
      }

      function 
    pop(){
        return 
    array_pop$this->elements );
      }

      function 
    zero(){
        
    $this->elements = array();
      }

    // end class FILO

    ?>
    zippen.php
    PHP-Code:
    <?php
    // Hier einzele Dateien eintragen
    // $zip_datei = "index.html"; 

    // Verzeichnispfad eintragen (Inhalt des "Uordner" wird gezippt, Ordnerstruktur bleibt erhalten!)
    $zip_ordner "Hauptordner/Uordner"

    // Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen. 
    ob_start(); 

    // Läd die Zip-Library 
    require("zip.lib.php"); 

    // Erstellt eine neue Zipdatei 
    $zipfile = new zipfile("Test.zip"); 

    // Fügt die Classe DeepDir.php ein . 
    require_once( 'DeepDir.php' ); 

      
    $dirName "$zip_ordner"
      
    $dir = new DeepDir(); 
      
    $dir->setDir$dirName ); 



      
    $dir->load(); 
      foreach( 
    $dir->files as $n => $pathToFile ){ 
       
    $zipfile->addFileAndRead("$pathToFile"); 
     } 
    // Wenn einzelne Dateien oben eingetragen werden dann die untere Zeile aktivieren
    // $zipfile->addFileAndRead("$zip_datei"); 

    // Gibt die Zip-Datei aus. 
    echo $zipfile->file();  
    ?>

    In einem abwasch zippen möchte die Ordner "Hauptordner/Uordner/UU1" und z.B. "Hauptordner/Uordner/UU3".

    Dank euch schonmal

  • #2
    Die fehlte noch:

    zip.lib.php
    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;
      var 
    $pathToFPDF    NULL;
      var 
    $pathToDeepDir NULL;

      function 
    zipfile ($output_filename 'archive.zip'$DeepDir './DeepDir.php'$FPDF './fpdf.php') {

        
    header('Content-Type: application/x-zip');
        
    header('Content-Disposition: inline; filename="' $output_filename '"');
        
    header('Expires: 0');
        
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        
    header('Pragma: public');

        
    $this->pathToFPDF    $FPDF;
        
    $this->pathToDeepDir $DeepDir;

      }

      function 
    read_File ($file) {

        if (
    is_file($file)) {

          
    $fp fopen ($file'rb');
          
    $content fread ($fpfilesize($file));
          
    fclose ($fp);

          return 
    $content;

        }

      }

      function 
    replaceSuffix ($file$suffix 'pdf') {

        
    $arr explode('.'$file);
        unset(
    $arr[count($arr) - 1]);
        
    $file NULL;
        foreach(
    $arr as $v$file .= $v '.';
        
    $file .= $suffix;

        return 
    $file;

      }

      function 
    getDirContent ($dirName './') {

        if (
    is_dir($dirName)) {

          if (@include(
    $this->pathToDeepDir)) {

            
    $dir = new DeepDir();
            
    $dir->setDir($dirName);
            
    $dir->load();

            return 
    $dir->files;

          } else {

            if (
    $handle opendir($dirName)) {

              while (
    false !== ($file readdir($handle))) {

                if ((
    $file != '.') && ($file != '..') && (is_file($file))) {

                  
    $content[] = $file;

                }

              }

              
    closedir($handle);

              return 
    $content;

            }

          }

        }

      }

      function 
    addDirContent ($dir './') {

        foreach (
    $this->getDirContent($dir) as $input) {
          
    $this->addFileAndRead(str_replace('.//'NULL$input));
        }

      }

      function 
    addFileAndRead ($file) {

        if (
    is_file($file))
          
    $this->addFile($this->read_File($file), $file);

      }

      function 
    addFileAsPDF ($file$title 'PDF File'$author 'Anonymous') {
        
    //You need FPDF to use this function!
        //get it at [url]http://www.fpdf.org/[/url]

        
    if (include($this->pathToFPDF)) {

          
    $pdf = new PDF();
          
    $pdf->Open();

          
    //edit this as you need it

          
    $pdf->SetTitle($title);
          
    $pdf->SetAuthor($author);
          
    $pdf->PrintChapter(1$author$file);

          
    //nothing to edit below!

          
    $this->addFile($pdf->getBuffer(), $this->replaceSuffix($file));

        } else {

          
    $filecontent implode(NULLfile($file));

          
    $content    .= '********************************************' "\n";
          
    $content    .= '*                                          *' "\n";
          
    $content    .= '*   Couldn\'t find FPDF!                   *' "\n";
          
    $content    .= '*   Adding this File as plain text file.   *' "\n";
          
    $content    .= '*                                          *' "\n";
          
    $content    .= '*   Below this box is the sourcefile.      *' "\n";
          
    $content    .= '*                                          *' "\n";
          
    $content    .= '********************************************' "\n";

          
    $content    .= ' ' "\n";
          
    $content    .= ' ' "\n";
          
    $content    .= ' ' "\n";

          
    $content    .= $filecontent;

          
    $this->addFile($content$file);

        }

      }

      function 
    unix2DosTime($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;

        }

        return ((
    $timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
          (
    $timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);

      }

      function 
    addFile($data$name$time 0) {

        
    $name     str_replace('\\''/'$name);

        
    $dtime    dechex($this->unix2DosTime($time));
        
    $hexdtime '\x' $dtime[6] . $dtime[7]
                  . 
    '\x' $dtime[4] . $dtime[5]
                  . 
    '\x' $dtime[2] . $dtime[3]
                  . 
    '\x' $dtime[0] . $dtime[1];

        eval(
    '$hexdtime = "' $hexdtime '";');

        
    $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   .= $hexdtime;             // 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 .= $hexdtime;                 // 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;

      }

      function 
    file() {

        
    $data    implode(NULL$this -> datasec);
        
    $ctrldir implode(NULL$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
      
    }

    }

    ?>

    Kommentar


    • #3
      Weis niemand einen Rat für mein Problem?

      Kommentar

      Lädt...
      X