Maison > développement back-end > tutoriel php > Comment la définition des en-têtes HTTP corrects améliore-t-elle l'expérience de téléchargement en PHP ?

Comment la définition des en-têtes HTTP corrects améliore-t-elle l'expérience de téléchargement en PHP ?

DDD
Libérer: 2024-11-20 01:18:02
original
653 Les gens l'ont consulté

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

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);
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal