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); } } }
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!