En-têtes de réponse HTTP pour les téléchargements de fichiers
Lors du traitement des téléchargements de fichiers en PHP, il est crucial de définir les en-têtes HTTP appropriés pour demander au navigateur de lancez le téléchargement plutôt que d’afficher le fichier dans le navigateur. L'un des en-têtes essentiels à prendre en compte est le "Content-Type".
Importance du "Content-Type"
La définition de l'en-tête "Content-Type" est vitale dans certains cas, comme l'ont signalé certains utilisateurs confrontés à une identification incorrecte du type de fichier. En omettant de spécifier le « Type de contenu », le navigateur peut recourir à des hypothèses par défaut, conduisant à une gestion inappropriée des fichiers.
Type de fichier générique
Bien qu'il soit possible de types MIME codés en dur pour diverses extensions de fichiers, une solution plus polyvalente consiste à déterminer dynamiquement le type MIME en fonction de l'extension de fichier à l'aide d'un tableau de types MIME connus. Cette approche simplifie le processus et évite le besoin d'un codage en dur approfondi.
Optimisation des performances
Pour résoudre le problème de performances rencontré dans l'extrait de code fourni, il vaut la peine d'inspecter le fichier. size et la taille du morceau utilisé pour lire le fichier. Si la taille du fichier est importante et que la taille du fragment est relativement petite, cela peut entraîner un retard notable dans l'apparition de la boîte de dialogue de téléchargement du navigateur. Pensez à utiliser une taille de fragment plus grande pour améliorer les performances.
Code mis à jour
Voici une version optimisée du code fourni, résolvant les problèmes mentionnés précédemment :
/** * 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); } } }
Conclusion
En définissant le "Content-Type" approprié et optimisant la lecture et la sortie des fichiers, ce code mis à jour devrait améliorer les performances et la fiabilité des téléchargements de fichiers gérés par le script PHP.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!