wieZucker: Downloadscript bereitet Probleme

Beitrag lesen

Hallo zusammen,
ich habe ein PHP-Script, das mir Dateien vom gleichen Server ausliefern soll. Ansich einfache Anforderung! Aber an den einfachsten Dinge scheitet man dann natürlich. *grr*

Und zwar habe ich folgende Probleme:
 * Im IE 6/7 lädt man die Datei runter, aber der Rechner kann damit nicht umgehen, weil die Dateien korrupt sind.
 * Lade ich die Datei mit dem selben Script via FF 3 runter, so kann ich sie problemlos anzeigen! Ausnahme ist eine Datei die mehr als 30MB benötigt. Diese wird zu 99% heruntergeladen und ist damit fehlerhaft. Zu groß? Wie kann ich es umgehen?
 * Gebe ich die Dateilänge nicht an, scheint es im IE zu funktionieren - hin und wieder. Dafür sieht man dann aber logischerweise nicht, wie lange es noch dauert.
 * In meinem geschriebenen Script (siehe unten) verwende ich fread(), welches mir den Inhalt liefert aber eben mit obigen Problemen. fgetc() hat zur Folge das der Download erst gar nicht startet (?), file_get_contents() liest genauso wie readfile() nichts aus, man erhält 0 Bytes.

Ich bin mit meinem Latein/PHP am Ende. Ich habe duzende Varianten versucht und bekomme das Script nicht einwandfrei ans laufen. Egal was ich mache, es hakt immer irgendwo. Ich benötige Hilfe.

Folgendes Script ist aktuell das Problem:

<?php  
    // Generelles  
    $filedir = './files/';  
  
    // Dateiort  
    $filename = strip_tags($_GET['file']);  
    $filename = str_replace('..', '', $filename);    // Entfernt alle relativen Subdir-Verweise  
    $filename = str_replace('./', '', $filename);    // Entfernt alle relativen dir-Verweise  
    $filename = str_replace('//', '', $filename);    // Entfernt alle doppelten Slashes  
    if($filename[0] == '/')  
        $filename = substr($filename, 1);    // Entfernt einfachen Slash an erster Position um doppelte Slashes im Pfad zu verhindern  
    $filepath = $filedir.$filename;  
  
    //prüfen ob Datei vorhanden  
    if($filename == '' || !file_exists($filepath) || !is_file($filepath))  
        die('Datei nicht verfügbar');  
  
    // Dateiinformationen laden  
    $filepath = realpath($filepath);  
    $fileinfo = pathinfo($filepath);  
    $fileinfo['size'] = filesize($filepath);  
  
    switch(strtolower($fileinfo['extension']))  
    {  
        // Archiv  
        case 'zip':  
            $fileinfo['mimetype'] = 'application/x-zip-compressed';  
            break;  
  
        // PDF  
        case 'pdf':  
            $fileinfo['mimetype'] = 'application/pdf';  
            break;  
  
        // Installer  
        case 'cab':  
        case 'exe':  
        case 'msi':  
        default:  
            $fileinfo['mimetype'] = 'application/octet-stream';  
            break;  
    }  
  
    // Datei öffnen  
    $fp = @fopen($filepath, 'rb');  
    if(!$fp)  
        die('FilePointer nicht gesetzt');  
  
    // Headerinformationen festlegen  
    header('Content-Type: '.$fileinfo['mimetype']);  
    header('Content-Disposition: attachment; filename="'.$filename.'"');  
    header('Content-Length: '.$fileinfo['size']);  
  
    // Ausgabe  
    @fseek($fp, 0, SEEK_SET);  
    while(!feof($fp))  
    {  
        //Reset für große Dateien  
        set_time_limit(0);  
        print @fread($fp, 1024*8);  
        flush();  
        ob_flush();  
    }  
  
    flush();  
    ob_end_clean();  
  
    if($fileinfo['size'] != ftell($fp))  
    {  
        // irgendwelche Fehler ...  
    }  
  
    @fclose($fp);  
    exit;  
?>

Meine Fragen lauten kurz und bündig:
 - Was ist falsch?
 - Wo ist der Fehler, weswegen man damit nicht mit allen Browsern, in allen Dateigrößen und -typen runterladen kann?
 - Wie kann ich das Problem beheben?

Ich hoffe, dass hier bei selfhtml Leute sind, die sich mehr dieser Sache annehmen. Bei bekannten anderen Foren war ich bislang wenig erfolgreich bzw. es wurde nicht mal ansatzweise darauf eingegangen.

Gruß