wieZucker: Downloadscript bereitet Probleme

Beitrag lesen

Hallo Felix!

switch(strtolower($fileinfo['extension']))
wozu bemühst Du Dich um den MIME-Type? Ich nehme für alles "application/octet-stream", damit der Download-Dialog des Browsers auch tatsächlich erscheint...

Mag sein, dass man es weg lassen kann. Ich habe aber schlichtweg nur Schwierigkeiten gehabt, weswegen ich es lieber komplett mache.

// Ausgabe
    @fseek($fp, 0, SEEK_SET);
Wozu das? Du hast doch gerade eine Datei zum Lesen geöffnet und den Dateizeiger deshalb schon am Anfang stehen!

Ich weiß, der Zeiger steht am Anfang wenn man eine Datei öffnet. Aber da das Auslesen fehlschlägt habe ich die "Sicher-ist-Sicher" Variante gewählt. Alle Eventualitäten aus dem Weg zu räumen.

//Reset für große Dateien
        set_time_limit(0);
Ist das wichtig? Hattest Du schon einen Timeout wegen eines zu langen Downloads?

Auch hier gilt, erstmal alle Fehlerquellen minimieren.

if($fileinfo['size'] != ftell($fp))
    {
        // irgendwelche Fehler ...
    }
Wieso kommt diese Prüfung hier? Wäre die nicht vor der Ausgabe der Datei an sich wesentlich gewesen?

Das war nur zum Debuggen notwendig. Ich habe versucht herauszufinden, warum die geladenen Dateigrößen geringer waren als ausgelesen. Und dort kam fast immer entweder gleich oder 0 Bytes gelesen raus.

exit;
Warum musst Du das Script hier zwangsbeenden?

»»

flush();
    ob_end_clean();
Wozu rufst Du diese zwei flushs erneut auf? Es gibt nach der Schleife nix mehr herunterzuspülen!

»»

ob_flush();
Was soll der output buffer? Benutzt du ihn wirklich?

Altlasten! :D Da sie in sofern nicht störend waren und nur das Script lauffähiger (im Sinne von Fehlerquellenminimierung) machten, habe ich sie stehen gelassen. Das exit habe ich allerdings schlichtweg vergessen.

Eine generelle Frage habe ich noch: Ist bei Deinem Server mod_gzip geladen, das die Ausgabe an den Browser komprimiert? Das könnte nämlich zu "falschen" Dateigrößenangaben führen!

Ist vorhanden! Aber filesize hat bislang immer die korrekten Werte ermittelt. Deswegen habe ich das erstmal nicht weiter beachtet. Grober Fehler?

Außerdem wäre es sehr sinnvoll, wenn Du in Deinem Script eine kleine Textdatei zum Debuggen öffnest, in die Du hineinschreibst, in welchen Verzweigungen Dein Script sich bewegt. Dazu kannst Du auch kleine Ausgaben bezüglich des $fileinfo-Arrays machen. Anschließend kannst Du diese Debug-Ausgaben mit deinem access-log vergleichen.

Ähnlich habe ich das ja auch gemacht - siehe if($fileinfo['size'] != ftell($fp))

Gruß