Ankündigung

Einklappen
Keine Ankündigung bisher.

prüfen ob Datei gedownloaded wird

Einklappen

Neue Werbung 2019

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

  • prüfen ob Datei gedownloaded wird

    Hallo, heute schon mein 2. Beitrag aber ich find in Google oder hier nichts vergleichbares.

    Ich möchte prüfen ob eine Datei gerade gedownloaded / heruntergeladen wird.

    habe es mit is_ writeable versucht bis ich gelesen habe, dass die Datei die geladen wird angeblich nicht die ist die auf dem Server liegt, sondern nur eine Kopie.

    Gibt es eine Möglichkeit die datei zu prüfen oder evtl. auch per IP oder was weiß ich, einen aktiven Download zu erkennen???
    Wer einen Fehler findet darf ihn behalten.


  • #2
    Nicht mit PHP. Ich weiß nicht ob es da irgend welche Extensions für deinen Webserver gibt aber wenn dann müsstest du dort ansetzen, denn vom Dateitransfer bekommt PHP nichts mit.

    Kommentar


    • #3
      Hm...

      hab in diesem Forum das hier gefunden:
      PHP-Code:
       $limit 10// Hier gibt man ein, wie viel Kilobyte pro Sekunde max. geladen werden dürfen. 
          
      $verzeichnis $pfad2// Downloadverzeichnis 
          
      $rundeslimit round($limit*1024); // Kilobytewert in Byte umrechnen 
           
          
      header('Cache-control: private'); 
          
      header('Content-type: application/octetstream');  
          
      header('Content-Length: '.filesize($verzeichnis.'/'.$_GET['file_to_download'])); 
          
      header('Content-Disposition: attachment; filename='.$_GET['file_to_download']);  
          
      // Attachementheader senden 
           
          
      flush(); 
          
      $fd fopen($verzeichnis.'/'.$_GET['file_to_download'], 'r'); 
          while(!
      feof($fd))  
          { 
              echo 
      fread($fd$rundeslimit); 
              
      flush(); 
              
      sleep(1); 
          } 
          
      // Die Speed-Sperre wird geschaltet 
      es ist ein script um die Downloadgeschwindikeit zu reduzieren und den Download zu starten. Kurz davor kopiere ich mit copy() die Datei in ein Tempverzeichnis und setze einen Keks um einen 2. Download zu verhindern,
      funktioniert bei mir auch. Dann habe ich versucht es mit:
      PHP-Code:
      if(feof($fd)) {
              if(
      unlink($verzeichnis.'/'.$_GET['file_to_download'])) {
                  
      setcookie('download''Keine');
              }
          }
          
      fclose ($fd); 
      für meine Bedürfnisse zu erweitern. Hierbei sollte gewartet werden bis der (ich glaub) "Dateizeiger" am Ende der Datei ist und dann die Datei aus tmp löschen, und den Keks setzen der sagt kein Download mehr da, der nächste kann starten.
      Wer einen Fehler findet darf ihn behalten.

      Kommentar


      • #4
        Der Benutzer kann aber den Download auch vorher abbrechen. Das PHP Skript aber trotzdem weiter rechnen!

        Kommentar


        • #5
          Stimmt schon, das ist dann aber sin Problem. Ich möchte ja, dass die Datei nach dem Download wieder aus dem temp gelöscht wird, damit sie nicht nochmal oder von andern geladen werden kann. Wie kann ich es sonst machen??

          Ich versteh auch nicht warum er bei while(!feof($fd)) wartet bis die datei geladen ist oder jemand abbricht und bei if(feof($fd)) nix macht.
          Wer einen Fehler findet darf ihn behalten.

          Kommentar


          • #6
            Was du da versuchst ist echt nicht das beste mit PHP. Da solltest du auf andere Techniken setzen, ansonsten müsstest du irgendwo speichern welche Dateien du in den tmp Ordner kopiert hast und diese dann nach so und so viel Minuten per Cronjob löschen oder sowas. Also mit PHP bekommst du da keine saubere Lösung hin!

            Kommentar


            • #7
              Ich will dich ja echt nicht nerven, im Gegenteil!! Bin froh, dass jemand so schnell antwortet. Gemerkt wird das im Cookie, und den Cronjob spar ich mir indem ich nach dem Cookie schau wenn der User irgend etwas macht. Hab aber doch langsam das Gefühl, dass es nix mehr wird. Evtl. schaut nochmal jemand in den nächsten Tagen vorbei der mir wenigstens sagen kann warum das mit dem feof nicht klappt.

              Danke trotzdem Flor1an.
              Wer einen Fehler findet darf ihn behalten.

              Kommentar


              • #8
                Wo rufst du denn dein if (feof(...)) auf?

                Kommentar


                • #9
                  Zitat von Domi_bas Beitrag anzeigen
                  Evtl. schaut nochmal jemand in den nächsten Tagen vorbei der mir wenigstens sagen kann warum das mit dem feof nicht klappt.
                  Liefere bitte erst mal eine nachvollziehbare Problembeschreibung - „klappt nicht“ ist keine.

                  Kommentar


                  • #10
                    also hier ist der komplette Quelltext
                    PHP-Code:
                    <?php

                    //Da sind die DAteien versteckt
                    $pfad1 $_SERVER['DOCUMENT_ROOT'].'/include/data/';

                    //Cookie verhindert, dass noch ein Download gestartet wird
                    setcookie('download'$pfad.'/'.$_GET['file_to_download']);

                    // Wenn ein Download angefordert wird
                    if(isset($_GET['file_to_download'])) {

                        
                    //TempFolder machen
                        
                    $temp_ip str_replace('.''-'$_SERVER['REMOTE_ADDR']);
                        
                    $tempname 'tmp_'.$temp_ip.'_'.date('h-i-s'time());
                        
                    mkdir($tempname0777);
                        
                    $pfad2 $_SERVER['DOCUMENT_ROOT'].'/include/'.$tempname;    
                        
                        
                    // Datei in TempFolder kopieren
                        
                    copy($pfad1.'/'.$_GET['file_to_download'], $pfad2.'/'.$_GET['file_to_download']);

                        
                    // für Speedbremse
                        
                    $limit 30// Hier gibt man ein, wie viel Kilobyte pro Sekunde max. geladen werden dürfen. 
                        
                    $rundeslimit round($limit*1024); // Kilobytewert in Byte umrechnen 
                        
                        // Attachementheader senden  
                        
                    header('Cache-control: private'); 
                        
                    header('Content-type: application/octetstream');  
                        
                    header('Content-Length: '.filesize($pfad2.'/'.$_GET['file_to_download'])); 
                        
                    header('Content-Disposition: attachment; filename='.$_GET['file_to_download']);  
                       
                        
                    // Speedbremse einschalten
                        
                    flush(); 
                        
                    $fd fopen($pfad2.'/'.$_GET['file_to_download'], 'r+'); 
                        
                        while(!
                    feof($fd))  
                        { 
                            echo 
                    fread($fd$rundeslimit); 
                            
                    flush(); 
                            
                    sleep(1); 
                        } 
                        
                        
                    //Wenn die Datei übertragen ist soll TempFolder gelöscht werden
                        
                    if(feof($fd)) {
                        
                    unlink(pfad2);
                        
                        
                    // und Cookie machen um den nächsten Download frei zu geben
                        
                    setcookie('download''Keine');
                        }
                        
                        
                    // Handle schließen
                        
                    fclose ($fd);
                    }        

                        
                        
                    ?>
                    Die Datei wird von einem anderen skript gewählt und per "download.php?file_to_download=test.txt aufgerufen"

                    Das geht nicht bezieht sich darauf, dass das Verzeichniss nach dem Download noch da ist und mein Cookie "download" nicht auf "Keine" steht.

                    Bevor Fragen kommen.... Der Download an sich mit der eingestellten Geschwindikeit und das erstellen meines Temp Verzeichnisses funzt ganz gut!!
                    Wer einen Fehler findet darf ihn behalten.

                    Kommentar


                    • #11
                      Zitat von Domi_bas Beitrag anzeigen
                      PHP-Code:
                      //...
                          // für Speedbremse
                          
                      $limit 30// Hier gibt man ein, wie viel Kilobyte pro Sekunde max. geladen werden dürfen. 
                          
                      $rundeslimit round($limit*1024); // Kilobytewert in Byte umrechnen 
                      Nur mal so nebenbei:
                      1 KILObyte (kbyte) hat 1000 Byte.
                      Die Geschwindigkeit von Datenübertragungen wird üblicherweise in 1000-er Schritten angegeben, also nichts mit 1024.

                      PHP-Code:
                      // ...
                           // Speedbremse einschalten
                          
                      flush(); 
                          
                      $fd fopen($pfad2.'/'.$_GET['file_to_download'], 'r+'); 
                          
                          while(!
                      feof($fd))  
                          { 
                              echo 
                      fread($fd$rundeslimit); 
                              
                      flush(); 
                              
                      sleep(1); 
                          } 
                      }        
                      // ... 
                      Wenn ich sowas lese, muss ich mich immer am Kopf kratzen.
                      Wozu diese dämliche "Geschwindigkeitsbegrenzung"? Je schneller ein Download beendet ist, umso eher kann der Server sich dem nächsten widmen. Mit sleep() wird lediglich dafür gesorgt, dass das Script länger im Speicher bleibt. Und PHP-Scripts verbraten eine Menge unnötigen Speicher.

                      Weiterhin glauben zwar viele, dass man mit flush() den Ausgabepuffer eines PHP-Scripts leeren könnte, leider hängt das in der Praxis von vielen anderen Umgebungsbedingungen ab, so dass es meistens nicht wie gewollt funktioniert.

                      Das geht nicht bezieht sich darauf, dass das Verzeichniss nach dem Download noch da ist und mein Cookie "download" nicht auf "Keine" steht.
                      PHP-Code:
                          unlink(pfad2); 
                      Mit unlink() löscht man keine Verzeichnisse, sondern mit rmdir(). Und Verzeichnisse, die nicht leer sind, lassen sich nicht so einfach löschen. Schalte mal error_reporting() an, dann siehst du auch die entsprechenden Fehlermeldungen.

                      Das Gleiche gilt für die zwei Aufrufe von setcookie() mit dem gleichen Name-Argument. Höchstwahrscheinlich gibts beim zweiten Aufruf nur eine Fehlermeldung, weil der gleiche Wert schon verwendet wurde.
                      Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                      Kommentar


                      • #12
                        Schalte mal error_reporting() an, dann siehst du auch die entsprechenden Fehlermeldungen.
                        Naja, eher nicht:
                        header('Content-type: application/octetstream');
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Zitat von fireweasel Beitrag anzeigen
                          Nur mal so nebenbei:
                          1 KILObyte (kbyte) hat 1000 Byte.
                          Die Geschwindigkeit von Datenübertragungen wird üblicherweise in 1000-er Schritten angegeben, also nichts mit 1024.
                          also, folgendes von Wikipedia:
                          Zitat von Wikipedia
                          1 Kilobyte (kB) = 1024 Byte ...
                          PHP-Code:
                          if ( $humans >= ) {
                             
                          war ();

                          Kommentar


                          • #14
                            Prinzipiell sollte man sich auf Wikipedia nicht verlassen, wäre mir aber auch neu das 1KB nur 1000Byte sind
                            "My software never has bugs, it just develops random features."
                            "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                            Kommentar


                            • #15
                              Naja alles was in Kilobyte, Megabyte, Gigabyte angegeben ist wird zur Basis 10 gerechnet. 1000 Byte = 1 Kilobyte (kB nicht KB!)

                              Und Kibibyte, Mebibyte und Gibibyte werden zur Basis 2 gerechnet, eben die 1024 Byte = 1 Kibibyte (KiB) usw.

                              Kommentar

                              Lädt...
                              X