Felix Riesterer: Downloadscript bereitet Probleme

Beitrag lesen

Liebe(r) wieZucker,

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...

// Datei öffnen
    $fp = @fopen($filepath, 'rb');

Das mache ich auch so...

// Headerinformationen festlegen
    header('Content-Type: '.$fileinfo['mimetype']);
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header('Content-Length: '.$fileinfo['size']);

Sieht auch wie bei mir aus...

// 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!

//Reset für große Dateien
        set_time_limit(0);

Ist das wichtig? Hattest Du schon einen Timeout wegen eines zu langen Downloads?

print @fread($fp, 1024*8);
        flush();

Habe ich auch...

ob_flush();

Was soll der output buffer? Benutzt du ihn wirklich?

flush();
    ob_end_clean();

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

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?

exit;

Warum musst Du das Script hier zwangsbeenden?

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!

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.

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)