tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
1120
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von dwex
    dwex dwex ist offline Mitglied Platin
    Registriert seit
    Apr 2005
    Ort
    Landshut (Niederbayern)
    Beiträge
    695
    Hallo Leute,

    ich versuche gerade ZIP-Files aus verschiedenen Dateien zu erstellen.
    Dazu habe ich mir die zip.lib.php geladen.
    In dieser zip.lib.php ist folgendes enthalten:
    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 http://www.fpdf.org/

        
    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
      
    }

    }

    ?>
    So jetzt habe ich in einer zweiten Datei folgenden Codeschnippsel:
    PHP-Code:
    <?php

    ob_start
    ();

    require(
    "./zip.lib.php");

    $zipfile = new zipfile("archive.zip");

    $zipfile->addFileAndRead("example.php");
    $zipfile->addFileAndRead("example1.php");

    echo 
    $zipfile->file();

    ?>
    Was passiert jetzt?:
    Die Dateien example.php und example1.php werden nun in das ZIP-File archive.zip gepackt und an den Browser geschickt.

    Meine Frage:
    Wie kann ich es schaffen, dass diese Datei auf dem Server in einem bestimmten Verzeichnis abgelegt und nicht an den Browser gesendet wird. Sollte die Datei auf dem Server bereits bestehen soll diese einfach überschrieben werden.
    Im weiteren Verlauf des Scriptes muss ich die Datei dann per FTP auf einen anderen Server schieben oder wahlweise per eMail versenden - das bekomme ich dann aber auch hin. Ich erwähne das nur - vielleicht gibt es auch einen besseren Weg - also die Datei gleich per FTP zu versenden oder so.

    Ich hoffe auf eure Hilfe!
    Vielen Dank dafür im voraus!
     
    Ich würde mich über die Bewertung meiner Beiträge mit Kurzkommentar sehr freuen!

    Die "dumme Frage" ist gewöhnlich das erste Anzeichen einer völlig neuen Entwicklung!
    -------------------
    Es ist immer Zeit etwas zu verändern ....
    .... das alles so bleibt wie es ist!

    -------------------
    Homepage Landshut
    -------------------
    /voodoo.css
    #meinFeind {position: absolute; bottom: -6ft;}

  2. #2
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Speichere den Rückgabewert der file()-Methode einfach in einer Datei.
     
    Markus Wulftange

  3. #3
    Avatar von Dennis Wronka
    Dennis Wronka Dennis Wronka ist offline Soulcollector
    Registriert seit
    Apr 2002
    Ort
    Hong Kong
    Beiträge
    12.296
    Blog-Einträge
    231
    Mit den FTP-Funktionen von PHP ist es meines Wissens nach nicht moeglich eine Datei direkt aus einer Variable auf den FTP-Server zu schreiben. Da muss erst lokal eine Datei erstellt werden die dann hochgeladen wird. Mit meiner FTP-Klasse hingegen ist es auch moeglich die Variable direkt in eine Datei auf dem FTP-Server zu schreiben.

    Uebrigens, bei einem Download, wie Du es ja jetzt hast, ist es in der Regel besser als Content-Disposition attachment und nicht inline zu nutzen.
     
    PHP Class Collection - PHP-Klassen fuer PHP 5 (und Teilweise auch fuer PHP 4)
    Updates: Catcher 1.1, FTPConnection 1.2, MultiSQL 1.1, RSS2 1.1, SMTPConnection 1.4
    __________________
    EasyLFS - Hintergrundinformationen, Installationsanleitung, Softwareliste und Download
    EasyLFS Projektthread - Informationen, Status und Diskussion zu meiner Linux-Distribution
    __________________
    Ich bin die Schildkroete, mein Sohn. Ich habe das Universum erschaffen, aber bitte mach mir daraus keinen Vorwurf; ich hatte Bauchschmerzen.
    __________________
    Zitat Zitat von Friedrich Nietzsche
    Man muss noch Chaos in sich haben, um einen tanzenden Stern gebaeren zu koennen.

  4. #4
    Avatar von dwex
    dwex dwex ist offline Mitglied Platin
    Registriert seit
    Apr 2005
    Ort
    Landshut (Niederbayern)
    Beiträge
    695
    @Gumbo:
    Ich habe jetzt die header in der zip.lib.php in den Zeilen 14-18 auskommentiert jetzt sendet er mir die Datei natürlich nicht mehr.
    Dann habe ich in mein Script folgendes eingebaut:
    PHP-Code:
    <?php

    ob_start
    ();

    require(
    "./zip.lib.php");

    $zipfile = new zipfile();

    $zipfile->addFileAndRead("example.php");
    $zipfile->addFileAndRead("example1.php");

    $daten $zipfile->file();

    $dateiname "datei.zip";
    $datei fopen($dateiname'a+');
    $datenschreiben fputs($datei$daten);

    ?>
    Jetzt habe ich das gewünschte und ich kann prüfen ob die Datei auch wirklich geschrieben wurde. Danke für den Tipp

    @Dennis:
    Danke für den Tipp mit der FTP-Klasse ich werde mir das gleich mal anschauen.

    Ihr seid Super!
    Geändert von dwex (26.07.06 um 09:54 Uhr)
     
    Ich würde mich über die Bewertung meiner Beiträge mit Kurzkommentar sehr freuen!

    Die "dumme Frage" ist gewöhnlich das erste Anzeichen einer völlig neuen Entwicklung!
    -------------------
    Es ist immer Zeit etwas zu verändern ....
    .... das alles so bleibt wie es ist!

    -------------------
    Homepage Landshut
    -------------------
    /voodoo.css
    #meinFeind {position: absolute; bottom: -6ft;}

Ähnliche Themen

  1. Mp3-Links nicht streamen, sondern lokal speichern (WinXP)
    Von kalterjava im Forum Audiotechnik, Recording & Audio-Software
    Antworten: 4
    Letzter Beitrag: 18.06.10, 08:42
  2. Bild nicht anzeigen sondern speichern
    Von ciberjoerg im Forum PHP
    Antworten: 4
    Letzter Beitrag: 31.03.10, 02:18
  3. Bild nicht öffnen sondern Speichern
    Von maga147 im Forum PHP
    Antworten: 6
    Letzter Beitrag: 03.04.07, 18:06
  4. Link nicht laden sondern speichern
    Von kesnw im Forum HTML & XHTML
    Antworten: 2
    Letzter Beitrag: 26.11.03, 15:54
  5. Antworten: 1
    Letzter Beitrag: 01.09.02, 10:11