Bagaimanakah menetapkan pengepala HTTP yang betul meningkatkan pengalaman muat turun dalam PHP?

DDD
Lepaskan: 2024-11-20 01:18:02
asal
587 orang telah melayarinya

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

Pengepala Respons HTTP untuk Muat Turun Fail

Apabila mengendalikan muat turun fail dalam PHP, adalah penting untuk menetapkan pengepala HTTP yang sesuai untuk mengarahkan penyemak imbas supaya mulakan muat turun daripada memaparkan fail dalam penyemak imbas. Salah satu pengepala penting yang perlu dipertimbangkan ialah "Jenis Kandungan."

Kepentingan "Jenis Kandungan"

Menetapkan pengepala "Jenis Kandungan" adalah penting dalam kes tertentu, seperti yang dilaporkan oleh sesetengah pengguna yang mengalami pengenalan jenis fail yang salah. Dengan gagal untuk menentukan "Jenis Kandungan", penyemak imbas mungkin menggunakan andaian lalai, yang membawa kepada pengendalian fail yang tidak sesuai.

Jenis Fail Generik

Walaupun mungkin untuk jenis mime kod keras untuk pelbagai sambungan fail, penyelesaian yang lebih serba boleh adalah dengan menentukan jenis mime secara dinamik berdasarkan sambungan fail menggunakan tatasusunan yang diketahui jenis mime. Pendekatan ini memudahkan proses dan mengelakkan keperluan untuk pengekodan keras yang meluas.

Pengoptimuman Prestasi

Untuk menangani isu prestasi yang dihadapi dalam coretan kod yang disediakan, anda patut menyemak fail saiz dan saiz ketulan yang digunakan untuk membaca fail. Jika saiz fail adalah besar, dan saiz ketulan agak kecil, ia boleh menyebabkan kelewatan yang ketara dalam dialog muat turun penyemak imbas muncul. Pertimbangkan untuk menggunakan saiz bongkah yang lebih besar untuk meningkatkan prestasi.

Kod Kemas Kini

Berikut ialah versi yang dioptimumkan bagi kod yang disediakan, menangani isu yang dinyatakan sebelum ini:

/**
 * 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);
        }
    }
}
Salin selepas log masuk

Kesimpulan

Dengan menetapkan yang sesuai "Jenis Kandungan" dan mengoptimumkan bacaan dan output fail, kod yang dikemas kini ini harus meningkatkan prestasi dan kebolehpercayaan muat turun fail yang dikendalikan oleh skrip PHP.

Atas ialah kandungan terperinci Bagaimanakah menetapkan pengepala HTTP yang betul meningkatkan pengalaman muat turun dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan