實現大文件下載的關鍵在於循環讀取字節流
function downloadFile($filename) {
//獲取文件的擴展名
$allowDownExt = array ( 'rar', 'zip', 'png', 'txt', 'mp4', 'html');
//獲取文件信息
$fileExt = pathinfo($filename);
//檢測文件類型是否允許下載
if(!in_array($fileExt['extension'], $allowDownExt)) {
return false;
}
//設置腳本的最大執行時間,設置為0則無時間限制
set_time_limit(0);
ini_set('max_execution_time', '0');
//通過header()發送頭信息
//因為不知道文件是什么類型的,告訴瀏覽器輸出的是字節流
header('content-type:application/octet-stream');
//告訴瀏覽器返回的文件大小類型是字節
header('Accept-Ranges:bytes');
//獲得文件大小
//$filesize = filesize($filename);//(此方法無法獲取到遠程文件大小)
$header_array = get_headers($filename, true);
$filesize = $header_array['Content-Length'];
//告訴瀏覽器返回的文件大小
header('Accept-Length:'.$filesize);
//告訴瀏覽器文件作為附件處理並且設定最終下載完成的文件名稱
header('content-disposition:attachment;filename='.basename($filename));
//針對大文件,規定每次讀取文件的字節數為4096字節,直接輸出數據
$read_buffer = 4096;
$handle = fopen($filename, 'rb');
//總的緩沖的字節數
$sum_buffer = 0;
//只要沒到文件尾,就一直讀取
while(!feof($handle) && $sum_buffer<$filesize) {
echo fread($handle,$read_buffer);
$sum_buffer += $read_buffer;
}
//關閉句柄
fclose($handle);
exit;
}
