HTTP-Header für Dateidownloads

Ich habe ein PHP-Skript geschrieben, das das Herunterladen von Dateien verwaltet, festlegt, welche Datei angefordert wird, und die richtigen HTTP-Header festlegt, damit der Browser die Datei tatsächlich herunterlädt (anstatt sie im Browser anzuzeigen).

Ich habe jetzt ein Problem, bei dem einige Benutzer bestimmte Dateien als falsch identifiziert gemeldet haben (unabhängig von der Erweiterung betrachtet der Browser sie daher als GIF-Bild). Ich vermute, das liegt daran, dass ich den "Inhaltstyp" nicht im Antwortheader festgelegt habe. Ist das höchstwahrscheinlich der Fall? Wenn ja, gibt es einen ziemlich generischen Typ, der für alle Dateien verwendet werden könnte, anstatt zu versuchen, jeden möglichen Dateityp zu berücksichtigen?

Zurzeit setze ich nur den Wert "Inhaltsdisposition: Anhang; Dateiname = arandomf.ile"

Aktualisieren Ich habe diese Anleitung hier befolgt, um einen stabileren Prozess für das Herunterladen von Dateien zu erstellen http: //w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php), aber es gibt eine erhebliche Verzögerung zwischen der Ausführung des Skripts und dem Anzeigen des Download-Dialogfelds des Browsers. Kann jemand den Engpass identifizieren, der dies verursacht?

Hier ist meine Implementierung:

/**
 * Outputs the specified file to the browser.
 *
 * @param string $filePath the path to the file to output
 * @param string $fileName the name of the file
 * @param string $mimeType the type of file
 */
function outputFile($filePath, $fileName, $mimeType = '') {
    // Setup
    $mimeTypes = array(
        'pdf' => 'application/pdf',
        'txt' => 'text/plain',
        'html' => 'text/html',
        'exe' => 'application/octet-stream',
        'zip' => 'application/zip',
        'doc' => 'application/msword',
        'xls' => 'application/vnd.ms-excel',
        'ppt' => 'application/vnd.ms-powerpoint',
        'gif' => 'image/gif',
        'png' => 'image/png',
        'jpeg' => 'image/jpg',
        'jpg' => 'image/jpg',
        'php' => 'text/plain'
    );

    $fileSize = filesize($filePath);
    $fileName = rawurldecode($fileName);
    $fileExt = '';

    // Determine MIME Type
    if($mimeType == '') {
        $fileExt = strtolower(substr(strrchr($filePath, '.'), 1));

        if(array_key_exists($fileExt, $mimeTypes)) {
            $mimeType = $mimeTypes[$fileExt];
        }
        else {
            $mimeType = 'application/force-download';
        }
    }

    // Disable Output Buffering
    @ob_end_clean();

    // IE Required
    if(ini_get('zlib.output_compression')) {
        ini_set('zlib.output_compression', 'Off');
    }

    // Send Headers
    header('Content-Type: ' . $mimeType);
    header('Content-Disposition: attachment; filename="' . $fileName . '"');
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');

    // Send Headers: Prevent Caching of File
    header('Cache-Control: private');
    header('Pragma: private');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

    // Multipart-Download and Download Resuming Support
    if(isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
        list($range) = explode(',', $range, 2);
        list($range, $rangeEnd) = explode('-', $range);

        $range = intval($range);

        if(!$rangeEnd) {
            $rangeEnd = $fileSize - 1;
        }
        else {
            $rangeEnd = intval($rangeEnd);
        }

        $newLength = $rangeEnd - $range + 1;

        // Send Headers
        header('HTTP/1.1 206 Partial Content');
        header('Content-Length: ' . $newLength);
        header('Content-Range: bytes ' . $range - $rangeEnd / $size);
    }
    else {
        $newLength = $size;
        header('Content-Length: ' . $size);
    }

    // Output File
    $chunkSize = 1 * (1024*1024);
    $bytesSend = 0;

    if($file = fopen($filePath, 'r')) {
        if(isset($_SERVER['HTTP_RANGE'])) {
            fseek($file, $range);

            while(!feof($file) && !connection_aborted() && $bytesSend < $newLength) {
                $buffer = fread($file, $chunkSize);
                echo $buffer;
                flush();
                $bytesSend += strlen($buffer);
            }

            fclose($file);
        }
    }
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage