dynamische Zip und Downloadrate

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

  • dynamische Zip und Downloadrate

    Hallo,

    ich habe ein Script erstellt, welches eine Zip erstellt und anschließend festlegt mit welcher Downloadrate diese Zip-Datei heruntergeladen werden kann. Der Name der Zip-Datei wird vom Besucher über den Link bestimmt. Beispiel: http://domain.tld/zip.php?dl=archive.zip

    Leider hat sich wohl ein (oder mehrere?) fehler eingeschlichen.
    Deshalb folgt das fehlerhafte Script, welches aus den zwei darauffolenden einzelnen Scripten beruht. Dessen Funktionen habe ich ebenfalls kommentiert

    PHP-Code:
        <?php

        
    // Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen.
        
    ob_start();
        
    // Läd die Zip-Library
        
    require("zip.lib.php");

        
    // Erstellt eine neue Zipdatei
        
    if (isset($_GET['dl'])) $file $_GET['dl']; else die();

        
    $zipfile = new zipfile("$file");

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

        
    // Verzeichnispfad eintragen (Inhalt des "Uordner" wird gezippt, Ordnerstruktur bleibt erhalten!) 
          
    $dir = new DeepDir(); 
          
    $dir->setDir("NAME_UNTERORDNER_AUF_SERVER"); 

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

           
    ob_start();
        
    // Gibt die Zip-Datei aus.
           
    $zipfile->pparse();
           
    ob_end_clean();

           
    $page ob_get_contents();
           
    ob_end_clean();

        
    $filedown "$page"// Datei zum Herunterladen 
        
    $speed 6// Downloadrate, hier 6 kb/s 

            
    header("Cache-control: private"); // Überlässt die Kontrolle der Dateiübertragung dem Script 
            
    header("Content-Type: application/octet-stream"); // Setzt den Header zum Download 
            
    header("Content-Length: ".filesize($filedown)); // Gibt die Dateigröße an 
            
    header("Content-Disposition: filename=$filedown"); // Definiert, wo die Datei liegt. 

            
    flush(); // Leert den Zwischenspeicher 

            
    $fd fopen($filedown"w"); // Öffnet die Datei zum Lesen 
            
    while(!feof($fd)) { 
                echo 
    fread($fdround($speed*1024)); // Liest und sendet exakt soviel KB, wie angegeben 
                
    flush(); // Leert wieder den Zwischenspeicher 
                
    sleep(1); // Setzt das Script für 1 Sekunde aus 
                
    fputs($fd,$filedownstrlen($filedown));
            } 
            
    fclose ($fd); 

        
    ?>

    ----------------------------------------------

    Der erste Teil des oberen Scriptes funktioniert, wenn man es einzeln als eigenständiges Script nutzt (Zip-Creator erstellt dynamische Zip-Datei mittels Angabe eines Ordners auf dem Server):

    PHP-Code:
        <?php

        
    // Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen.
        
    ob_start();
        
    // Läd die Zip-Library
        
    require("zip.lib.php");

        
    // Erstellt eine neue Zipdatei
        
    if (isset($_GET['dl'])) $file $_GET['dl']; else die();

        
    $zipfile = new zipfile("$file");

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

        
    // Verzeichnispfad eintragen (Inhalt des "Uordner" wird gezippt, Ordnerstruktur bleibt erhalten!) 
          
    $dir = new DeepDir(); 
          
    $dir->setDir("NAME_UNTERORDNER_AUF_SERVER"); 

          
    $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();

        
    ?>
    ------------

    Das zweite Script funktioniert als eigenständiges Script ebenfalls wie gewünscht und gibt die Downloadgeschwindigkeit beim Download einer Datei (hier "datei.zip") an:

    PHP-Code:
        <?php 

        
    if (isset($_GET['dl'])) $file $_GET['dl']; else die(); 

        
    // $file = "datei.zip"; DIESE ZEILE WIRD N I C H T MEHR BENUTZT !!!
        
    $speed 6// Downloadrate, hier 6 kb/s 

        
    if(file_exists($file) && is_file($file)) { // Prüfung auf Existenz der Datei 
            
    header("Cache-control: private"); // Überlässt die Kontrolle der Dateiübertragung dem Script 
            
    header("Content-Type: application/octet-stream"); // Setzt den Header zum Download 
            
    header("Content-Length: ".filesize($file)); // Gibt die Dateigröße an 
            
    header("Content-Disposition: filename=$file"); // Definiert, wo die Datei liegt. 

            
    flush(); // Leert den Zwischenspeicher 

            
    $fd fopen($file"r"); // Öffnet die Datei zum Lesen 
            
    while(!feof($fd)) { 
                echo 
    fread($fdround($speed*1024)); // Liest und sendet exakt soviel KB, wie angegeben 
                
    flush(); // Leert wieder den Zwischenspeicher 
                
    sleep(1); // Setzt das Script für 1 Sekunde aus 
            

            
    fclose ($fd); 
        } 
        
    ?>
    Das ist mein erster Beitrag. Bitte nehmt Rücksicht auf mich, falls was nicht in Ordnung ist mit diesem Posting. Viele Grüße, Dennis
    Zuletzt geändert von delogam; 01.05.2007, 02:41.

  • #2
    du hast die frage vergessen.

    Kommentar


    • #3
      Die Frage lautet: Was muss ich ändern und/oder hinzufügen, damit das obere Script funktioniert (beide Code-Teile zusammen)?

      Info: Zuerst soll ein Ordner als Zip angeboten werden, dann die Downloadgeschwindigkeit festgelegt werden (die Zip-Datei wird dynamisch erstellt)
      Zuletzt geändert von delogam; 01.05.2007, 02:03.

      Kommentar


      • #4
        der trick besteht darin, keine fehler zu machen.

        machst du welche? wenn ja - wo?

        Kommentar


        • #5
          Im ersten Post funktioneren die Scripte (zweiter und dritter PHP-Code), wenn man sie einzeln benutzt.

          Fehler entstehen womöglich hier:

          PHP-Code:
          ob_start();
          // Gibt die Zip-Datei aus.
             
          $zipfile->pparse();
             
          ob_end_clean();

             
          $page ob_get_contents();
             
          ob_end_clean();

          $filedown "$page"// Datei zum Herunterladen 
          $speed 6// Downloadrate, hier 6 kb/s 
          und hier muss vielleicht statt "w" ein "r" hin ???
          PHP-Code:
          $fd fopen($filedown"w"); // Öffnet die Datei zum Lesen 
          Ziel soll aber sein, daß das Script, welches für die Zip-Erstellung zuständig ist, während der Ausgabe dazu zu bringen, das der Download mit 6 kb angeboten wird.

          Fehler entstehen nur, wenn ich das Script zusammenführe, wie der erste PHP-Code aus dem ersten Post
          Zuletzt geändert von delogam; 01.05.2007, 02:22.

          Kommentar


          • #6
            in diesen salat werde ich wohl nicht hineinschauen, weil mich schon
            PHP-Code:
            // Gibt die Zip-Datei aus.
               
            $zipfile->pparse(); 
            in einem block und
            PHP-Code:
            // Gibt die Zip-Datei aus.
            echo $zipfile->file(); 
            stört.

            ansonsten: ist doch richtig, nur muss $fd ein handle auf das archiv zum lesen sein. das wird bei dir vermutlich etwas anderes sein.

            Kommentar


            • #7
              Anders gefragt: Wie könnte man beide Scripte verbinden?

              Dieses Script erstellt dynamische Zip-Datei mittels Angabe eines Ordners auf dem Server:
              PHP-Code:
              <?php

              // Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen.
              ob_start();
              // Läd die Zip-Library
              require("zip.lib.php");

              // Erstellt eine neue Zipdatei
              if (isset($_GET['dl'])) $file $_GET['dl']; else die();

              $zipfile = new zipfile("$file");

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

              // Verzeichnispfad eintragen (Inhalt des "Uordner" wird gezippt, Ordnerstruktur bleibt erhalten!) 
                
              $dir = new DeepDir(); 
                
              $dir->setDir("NAME_UNTERORDNER_AUF_SERVER"); 

                
              $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();

              ?>
              ------------

              Das zweite Script gibt die Downloadgeschwindigkeit beim Download einer Datei auf dem Server befindlichen Datei an (Hier "datei.zip"):
              PHP-Code:
              <?php 

              if (isset($_GET['dl'])) $file $_GET['dl']; else die(); 

              // $file = "datei.zip"; DIESE ZEILE WIRD N I C H T MEHR BENUTZT !!!
              $speed 6// Downloadrate, hier 6 kb/s 

              if(file_exists($file) && is_file($file)) { // Prüfung auf Existenz der Datei 
                  
              header("Cache-control: private"); // Überlässt die Kontrolle der Dateiübertragung dem Script 
                  
              header("Content-Type: application/octet-stream"); // Setzt den Header zum Download 
                  
              header("Content-Length: ".filesize($file)); // Gibt die Dateigröße an 
                  
              header("Content-Disposition: filename=$file"); // Definiert, wo die Datei liegt. 

                  
              flush(); // Leert den Zwischenspeicher 

                  
              $fd fopen($file"r"); // Öffnet die Datei zum Lesen 
                  
              while(!feof($fd)) { 
                      echo 
              fread($fdround($speed*1024)); // Liest und sendet exakt soviel KB, wie angegeben 
                      
              flush(); // Leert wieder den Zwischenspeicher 
                      
              sleep(1); // Setzt das Script für 1 Sekunde aus 
                  

                  
              fclose ($fd); 

              ?>

              Kommentar


              • #8
                das ist copy&paste. denken fände ich viel angebrachter.

                du gibst mit
                PHP-Code:
                echo $zipfile->file(); 
                die datei aus. stattdessen solltest du sie mit fopen zum lesen öffnen und dann mit fread gebuffert ausgeben.

                Kommentar


                • #9
                  PHP-Code:
                  echo fread($fdround($speed*1024)); 
                  Das würde ich mit dem echo §zipfile->file(); tauschen

                  PHP-Code:
                      echo $speed 6// Downloadrate, hier 6 kb/s 

                          
                  header("Cache-control: private"); // Überlässt die Kontrolle der Dateiübertragung dem Script 
                          
                  header("Content-Type: application/octet-stream"); // Setzt den Header zum Download 
                          
                  header("Content-Length: ".filesize($zipfile)); // Gibt die Dateigröße an 
                          
                  header("Content-Disposition: filename=$zipfile"); // Definiert, wo die Datei liegt. 

                          
                  flush(); // Leert den Zwischenspeicher 

                          
                  $fd fopen($zipfile"r"); // Öffnet die Datei zum Lesen 
                          
                  while(!feof($fd)) { 
                              echo 
                  fread($fdround($speed*1024)); // Liest und sendet exakt soviel KB, wie angegeben 
                              
                  flush(); // Leert wieder den Zwischenspeicher 
                              
                  sleep(1); // Setzt das Script für 1 Sekunde aus 
                          

                          
                  fclose ($fd); 
                  was genau muss ich bei der echo ausgabe ändern oder einfügen?
                  PS: Mit copy&paste hast du wohl recht.

                  Meinst Du das wäre korrekt so?
                  Zuletzt geändert von delogam; 01.05.2007, 02:53.

                  Kommentar


                  • #10
                    im zweiten script soll $file der name des archivs sein.

                    Kommentar


                    • #11
                      korrekt, aber $file ist schon im ersten Teil gegeben. Dort sagt dieses Object aus, wie die Zip-Datei heißen soll und das bestimmt der Eintrag in der URL.

                      $file2 müsste ich das nennen, wenn es um die Geschwindigkeit geht, oder?

                      Kommentar


                      • #12
                        nenns wie du willst, hauptsache du verstehst, was passiert.

                        Kommentar


                        • #13
                          Ich kann kein PHP. Oben stehende Codes habe ich gestern geschrieben.
                          Ich schaue mir bisher nur die Codes an, analysiere deren Funktionen und lerne hinzu.

                          Nur bei diesem Problem hier, komme ich halt nicht weiter.
                          Zuletzt geändert von delogam; 01.05.2007, 03:15.

                          Kommentar


                          • #14
                            Kann ich die dynamisch erstellte Zip-Datei bzw. die untenstehende Ausgabe-Funktion vor dem tatsächlichen Download zwischenspeichern mittels zweiten Script und wie?
                            Mir ist klar dass der Downlaod der Zip-Datei durch
                            PHP-Code:
                            echo $zipfile->file(); 
                            gestartet wird. Aber der Download ist noch schnell für meine Bedürfnisse.

                            Ich habe schon versucht am ende:
                            etwa
                            PHP-Code:
                            echo $langsam $zipfile->file() 
                            oder kann man in "file()" etwas angeben?

                            $downloadspeed = zweites Script

                            Das sind meine Ideen. Aber es hapert an der Umsetzung, mangels Erfahrung mit PHP
                            Zuletzt geändert von delogam; 01.05.2007, 03:31.

                            Kommentar


                            • #15
                              Ich habe schon versucht am ende:
                              etwa

                              PHP-Code:
                              echo $langsam $zipfile->file() 
                              du hast $bitte vergessen.

                              dann lass dir zeit mit dem lernen, es ist kein einfaches skript. die idee mit dem archivnamen in $file habe ich bereits genannt. und jetzt fang nicht mit code-gegammele an, sondern lies dir lieber mal peterkropff.de bzw. tut.php-q.net durch.

                              Kommentar

                              Lädt...
                              X