Heim >Backend-Entwicklung >PHP-Tutorial >Wie verbessert das Setzen der richtigen HTTP-Header das Download-Erlebnis 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!