Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Gedownloadete Datei hat nur 2KByte!

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Gedownloadete Datei hat nur 2KByte!

    Hallo Leute,
    auf meiner Website habe ich MP3s zum freien Download.
    Der Download selbst läuft über ein php-Skript, welches den Download initiiert und die Downloadzahl in eine Datenbankdatei schreibt, sodass ich diese auf der Seite ausgeben kann.
    Funktioniert alles blendend - bis auf eine Sache!
    Wenn User den Download-Link anklicken, öffnet sich zwar der Download-Dialog (Speichern unter..etc..) klickt man nun aber auf Download ist der DL-Manager sofort fertig und zeigt an, dass er soeben eine 0-15 KB große Datei heruntergeladen hat (Größe der Dateien variiert, mal 8 KB, mal 2 KB usw.)
    Die eigentlichen MP3s haben aber eine Dateigröße zwischen 5-8 Mbyte.
    Bitte helft mir, hab schon einiges daran herumprobiert und bin gnadenlos daran verzweifelt. Bin kein guter php-Coder, aber Grundkenntnisse dürfte ich beherrschen - nur scheinen die hier leider nicht zu reichen.
    Vielen Dank schonmal im Voraus!

    Seite, auf der die Downloads liegen:
    Cy-Music - High Quality Producing

    Hier mein Downloadskript (bestehend aus "download.php", "functions.php" und "counts.db"):

    download.php
    PHP-Code:
    <?php

    $uri 
    "http://www.cy-music.de/main/"//uri zum Ordner, der diese Datei enthält
    $downloadCountFile "./counts.db"//Pfad zur Datei, die die Downloads zählt
    $folder "downloads/"//Ordner mit den Download-Dateien in Relation zur uri

    include "functions.php";

    $file $_GET['f'];

    if(isset(
    $file)) {
        
    $fileDownloadCount downloadCount($file$downloadCountFile);
        
    $newFileDownloadCount $fileDownloadCount 1;
        
    $oldValue $file." ".$fileDownloadCount;
        
    $newValue $file." ".$newFileDownloadCount;
        
    $open = @fopen($downloadCountFile"r");
        
    $oldData = @fread($openfilesize($downloadCountFile));
        
    $close = @fclose($open);
        if(!
    $oldData) {
            
    $newData $newValue;
        }
        elseif(
    $fileDownloadCount == 0) {
            
    $newData $oldData."\n".$newValue;
        }
        else {
            
    $newData str_replace($oldValue$newValue$oldData);
        }
        
    logEvent($downloadCountFile$newData"w");
        
    $open2 fopen($uri.$folder.$file"r");
        
    $fileSize filesize($folder.$file);
        
    $fileContent fread($open2$fileSize);
        
    header("Content-Type: audio/mpeg");
        
    header("Content-Length: ".$filesize);
        
    header("Content-Disposition: attachment; filename= ".$file);
        echo 
    $fileContent;
        
    fclose($open2);
        exit;
    }
    ?>
    functions.php
    PHP-Code:
    <?php
    function downloadCount($fileName$countFile)
    {
        
    $open = @fopen($countFile"r");
        
    $size = @filesize($countFile);
        
    $downloadCounts = @fread($open$size);
        
    $close = @fclose($open);
        
    $downloadsArray explode("\n"$downloadCounts);
        foreach(
    $downloadsArray as $array) {
            if(
    ereg($fileName$array)) {
                
    $fileDownloadArray explode(" "$array);
                
    $fileDownloadCount $fileDownloadArray[1];
            }
        }
        if(!
    $fileDownloadCount) {
            
    $fileDownloadCount 0;
        }
        return 
    $fileDownloadCount;
    }

    function 
    logEvent($fileName$message$writeMode)
    {
        
    $open fopen($fileName$writeMode);
        
    fwrite($open$message);
        
    fclose($open);
    }
    ?>
    Die Downloadzahlen werden wie bereits erwähnt in eine Datei namens "counts.db" geschrieben.

    Wie die Downloadlinks aufgebaut sind, könnt ihr euch ja im Quelltext auf der obig geposteten Seite anschauen.

    Hoffe, ihr könnt mir helfen!
    Gruß
    Cy-Music

  • #2
    Hast du mal (mit einem Texteditor) reingeschaut in eine solche darüber heruntergeladene „mp3“-Datei? (Rhetorische Frage - natürlich hast du nicht. Hättest du aber, wenn du selbst mal mit ein bisschen Logik an die Fehlersuche herangegangen wärst!)
    Da steckt ein HTML-Dokument drin mit dem Titel „beispielseite.de - Informationen zum Thema beispiel seite. Diese Website steht zum Verkauf!“


    Und warum willst du die Dateien, die doch schon auf deinem Webspace liegen, über HTTP einlesen, warum nicht über's Dateisystem?
    Vermutlich ist das auch die Ursache des Problems, dass bei ersterem irgendwas falsch läuft - liest du die Daten gleich aus dem Dateisystem, dann stellt sich das Problem vermutlich erst gar nicht.


    Und wenn du noch mal Code hier postest, in dem noch der @-Operator zur Fehlerunterdrückung verwendet wird, dann gibt's was auf die Mütze -dass man den mal als allererstes entfernt, wenn man Fehler suchen will, sollte klar sein.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Das mit der Beispielseite ist behoben. War ursprünglich mal auf diese Weise zu nem Kumpel geschickt worden, der sich das mal angucken wollte. Hatte da alle Links zu "www.beispielseite.de" geändert.
      Wenn ich jetzt ne geladene MP3 mit dem Editor öffne, stehen da nur die ID3-Tags und viele undefinierbare Zeichen.

      Zum @Operator:
      Das Skript ist schon älter, ist ursprünglich nicht von mir sondern stammt vom Hazard.Download.Counter. Hab leider keinen Link zur Seite, sonst würd ich den posten.
      Hab den Autor des Skripts auch schon versucht per e-Mail zu kontaktieren, aber er antwortet nicht, wahrscheinlich ne alte e-Mail-Addy.

      Über's Dateisystem einlesen?
      Meinst du damit relative statt absolute Links benutzen?
      Mal versuchen...

      Schonmal danke für die schnelle Antwort!

      EDIT: Hab den Download-Link mal relativ gesetzt - also anstatt "http://.........." gleich "download.php?..." usw. aber Datei hat trotzdem nur 2 KByte. Wär zu schön gewesen!

      Kommentar


      • #4
        Zitat von Cy-Music Beitrag anzeigen
        Das mit der Beispielseite ist behoben. War ursprünglich mal auf diese Weise zu nem Kumpel geschickt worden, der sich das mal angucken wollte. Hatte da alle Links zu "www.beispielseite.de" geändert.
        Na toll ... kannst du sowas bitte demnächst korrigieren, bevor du fragst!?!

        Über's Dateisystem einlesen?
        Meinst du damit relative statt absolute Links benutzen?
        Nein, ich meine überhaupt erst mal statt HTTP das Dateisystem benutzen.

        Und dir erst mal über den Unterschied dieser beiden Zugriffsweisen klar werden, falls das noch nicht der Fall ist.



        Und dass das Script nur Teile der Dateien ausliefert, ist auch klar - zumindest dann, wenn man sich die Beschreibung von fread im Manual mal durchliest.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          Zitat von ChrisB Beitrag anzeigen
          Na toll ... kannst du sowas bitte demnächst korrigieren, bevor du fragst!?!
          Sorry dafür! xD
          Kleiner Organisationsfehler.

          Nein, ich meine überhaupt erst mal statt HTTP das Dateisystem benutzen.
          Und dir erst mal über den Unterschied dieser beiden Zugriffsweisen klar werden, falls das noch nicht der Fall ist.
          Hab mal ein bisschen dazu gegooglet und versteh's nicht so wirklich.
          Meinst du damit, alles über Datenbanken (mysql, phpmyadmin) laufen zu lassen? Wäre nett, wenn du das ein klein wenig mehr für Einsteiger wie mich ausführen könntest, damit ich wenigstens weiß, worüber ich mich schlau machen muss

          Danke

          Kommentar


          • #6
            Was gibt es denn am Unterschied zwischen einem Zugrif über HTTP und dem lokalen Dateisystem des Webservers nicht zu verstehen ...?

            Und nein, damit ist keine Datenbank gemeint - sondern einfach nur die Speicherung von Daten auf der Festplatte, wie bei deinem Compi zuhause auch.
            Und von eben dort (von der Festplatte des Servers) kann man die per PHP auch auslesen - das stattdessen über HTTP zu machen, ist ein unperformanter und unnötiger Umweg.

            Noch mehr ins Detail gehe ich dazu jetzt aber nicht. Wenn dir die absolut grundlegenden Funktionsprinzipien eines Webservers und von HTTP nicht klar sind, informiere dich.

            Zumal es daran, wie in der letzten Antwort schon gesagt, ja offenbar doch nicht liegt. (Da hast du mich mit deinem ändern der Adressangabe im Script auf www.beispielseite.de in die Irre geführt.)
            [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

            Kommentar


            • #7
              Alles klar, danke für die schnelle Antwort ich werde mich bezüglich dieses Dateisystems mal schlau machen, war mir bislang unbekannt.

              Zu deinem fread()-Hinweis:
              Wie du bereits sagtest, hab ich mich über diese Funktion mal informiert und dann das gefunden:
              Reading stops when 8192 bytes have been read (after opening userspace stream)
              Ist ja klar, dass der Download dann immer nach knapp 8 KByte stoppt...

              Gibt es eine andere Funktion bzw. Möglichkeit, die in ihrer Wirkungsweise der der Funktion fread() entspricht, nur eben die volle Byteanzahl liest?

              Kommentar


              • #8
                Zitat von Cy-Music Beitrag anzeigen
                Gibt es eine andere Funktion bzw. Möglichkeit, die in ihrer Wirkungsweise der der Funktion fread() entspricht, nur eben die volle Byteanzahl liest?
                fpassthru wird auf der Seite über fread explizit verlinkt; readfile wäre auch noch eine Alternative. Letzteres ist allerdings bei größeren Dateien nicht uneingeschränkt zu empfehlen. Und die Nutzerkommentare im Manual halten auch noch einiges an hilfreichen Tipps und Hinweisen parat.
                [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                Kommentar


                • #9
                  Klasse! Vielen Dank!
                  Der Download funzt jetzt, einziges Problem, das jetzt noch besteht ist, dass ich wenn ich eine Datei zum herunterladen anklicke, diese im Download-Dialog immer "download.php" und nicht eben "musikstück.mp3" (zum Beispiel) heißt.
                  Allerdings wird nun die volle Byteanzahl geladen. Auf dem Desktop sieht man eine php-Text-Datei, die sich aber in Playern wie WMP oder Winamp problemlos als Musikdatei öffnen und abspielen lässt.

                  Woran kann jetzt dieser Fehler noch liegen?
                  Hier das veränderte Skript:

                  download.php
                  PHP-Code:
                  <?php

                  $uri 
                  "http://www.cy-music.de/main/"//uri zum Ordner, der diese Datei enthält
                  $downloadCountFile "./counts.db"//Pfad zur Datei, die die Downloads zählt
                  $folder "downloads/"//Ordner mit den Download-Dateien in Relation zur uri

                  include "functions.php";

                  $file $_GET['f'];

                  if(isset(
                  $file)) {
                      
                  $fileDownloadCount downloadCount($file$downloadCountFile);
                      
                  $newFileDownloadCount $fileDownloadCount 1;
                      
                  $oldValue $file." ".$fileDownloadCount;
                      
                  $newValue $file." ".$newFileDownloadCount;
                      
                  $open fopen($downloadCountFile"r");
                      
                  $oldData fread($openfilesize($downloadCountFile));
                      
                  $close fclose($open);
                      if(!
                  $oldData) {
                          
                  $newData $newValue;
                      }
                      elseif(
                  $fileDownloadCount == 0) {
                          
                  $newData $oldData."\n".$newValue;
                      }
                      else {
                          
                  $newData str_replace($oldValue$newValue$oldData);
                      }
                      
                  logEvent($downloadCountFile$newData"w");
                      
                  $open2 fopen($uri.$folder.$file"rb");
                      
                  $fileSize filesize($folder.$file);
                      
                  header("Content-Type: audio/mpeg");
                      
                  header("Content-Length: ".$filesize);
                      
                  $fileContent fpassthru($open2);
                      exit;
                  }
                  ?>
                  EDIT:
                  Ok, hab's gefunden!
                  Vielen Dank Chris!
                  Hast mir sehr geholfen und ein paar Sachen über gewisse Fehler-Operatoren, Dateisysteme und php-Funktionen hab ich dank dir auch gelernt!
                  Hoffe, ich muss nun nicht mehr so oft auf eure/deine Hilfe zurückgreifen!
                  Danke nochmals.

                  Hier das finale (lauffähige) Skript:

                  download.php
                  PHP-Code:
                  <?php

                  $uri 
                  "http://www.cy-music.de/main/"//uri zum Ordner, der diese Datei enthält
                  $downloadCountFile "./counts.db"//Pfad zur Datei, die die Downloads zählt
                  $folder "downloads/"//Ordner mit den Download-Dateien in Relation zur uri

                  include "functions.php";

                  $file $_GET['f'];

                  if(isset(
                  $file)) {
                      
                  $fileDownloadCount downloadCount($file$downloadCountFile);
                      
                  $newFileDownloadCount $fileDownloadCount 1;
                      
                  $oldValue $file." ".$fileDownloadCount;
                      
                  $newValue $file." ".$newFileDownloadCount;
                      
                  $open fopen($downloadCountFile"r");
                      
                  $oldData fread($openfilesize($downloadCountFile));
                      
                  $close fclose($open);
                      if(!
                  $oldData) {
                          
                  $newData $newValue;
                      }
                      elseif(
                  $fileDownloadCount == 0) {
                          
                  $newData $oldData."\n".$newValue;
                      }
                      else {
                          
                  $newData str_replace($oldValue$newValue$oldData);
                      }
                      
                  logEvent($downloadCountFile$newData"w");
                      
                  $open2 fopen($uri.$folder.$file"rb");
                      
                  $fileSize filesize($folder.$file);
                      
                  header("Content-Type: audio/mpeg");
                      
                  header("Content-Length: ".$filesize);
                      
                  header("Content-Disposition: attachment; filename= ".$file);
                      
                  $fileContent fpassthru($open2);
                      echo 
                  $fileContent;
                      
                  fclose($open2);
                      exit;
                  }
                  ?>

                  Kommentar

                  Lädt...
                  X