Heim >Backend-Entwicklung >PHP-Tutorial >Wie verbessert das Setzen der richtigen HTTP-Header das Download-Erlebnis in PHP?

Wie verbessert das Setzen der richtigen HTTP-Header das Download-Erlebnis in PHP?

DDD
DDDOriginal
2024-11-20 01:18:02666Durchsuche

How does setting the correct HTTP headers enhance the download experience in PHP?

HTTP-Antwortheader für Dateidownloads

Beim Umgang mit Dateidownloads in PHP ist es wichtig, die entsprechenden HTTP-Header festzulegen, die der Browser anweisen soll Starten Sie den Download, anstatt die Datei im Browser anzuzeigen. Einer der wichtigsten zu berücksichtigenden Header ist der „Content-Type“.

Wichtigkeit des „Content-Type“

Das Festlegen des „Content-Type“-Headers ist von entscheidender Bedeutung In bestimmten Fällen, wie von einigen Benutzern berichtet, kommt es zu einer falschen Identifizierung des Dateityps. Wenn der „Inhaltstyp“ nicht angegeben wird, greift der Browser möglicherweise auf Standardannahmen zurück, was zu einer unangemessenen Dateiverarbeitung führt.

Generischer Dateityp

Dies ist zwar möglich Wenn Sie Mime-Typen für verschiedene Dateierweiterungen fest codieren möchten, besteht eine vielseitigere Lösung darin, den Mime-Typ basierend auf der Dateierweiterung mithilfe eines Arrays bekannter Mime-Typen dynamisch zu bestimmen. Dieser Ansatz vereinfacht den Prozess und vermeidet die Notwendigkeit einer umfangreichen Hardcodierung.

Leistungsoptimierung

Um das Leistungsproblem im bereitgestellten Code-Snippet zu beheben, lohnt es sich, die Datei zu überprüfen Größe und die Blockgröße, die zum Lesen der Datei verwendet wird. Wenn die Dateigröße erheblich und die Blockgröße relativ klein ist, kann es zu einer erheblichen Verzögerung beim Erscheinen des Download-Dialogfelds des Browsers kommen. Erwägen Sie die Verwendung einer größeren Blockgröße, um die Leistung zu verbessern.

Aktualisierter Code

Hier ist eine optimierte Version des bereitgestellten Codes, die die zuvor genannten Probleme behebt:

/**
 * 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 / $fileSize);
    }
    else {
        $newLength = $fileSize;
        header('Content-Length: ' . $fileSize);
    }

    // Output File
    $chunkSize = 8 * (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);
        }
    }
}

Fazit

Durch die Festlegung des entsprechenden „Content-Type“ und die Optimierung des Dateilesens und der Dateiausgabe sollte dieser aktualisierte Code die Leistung und Zuverlässigkeit der vom PHP-Skript verarbeiteten Dateidownloads verbessern .

Das obige ist der detaillierte Inhalt vonWie verbessert das Setzen der richtigen HTTP-Header das Download-Erlebnis in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn