<?php //设置脚本的最大执行时间,设置为0则无时间限制 set_time_limit(0); ini_set('max_execution_time', '0'); $file_name = 'aa.zip'; //本机文件地址 $extension = pathinfo($file_name)['extension']; $dowload_name = '资料.'.$extension; $file_dir = "./"; //下载文件存放目录 //检查文件是否存在 if (!file_exists($file_dir . $file_name)) { header('HTTP/1.1 404 NOT FOUND'); } else { //以只读和二进制模式打开文件 $file = fopen($file_dir . $file_name, "rb"); //告诉浏览器这是一个文件流格式的文件 Header("Content-type: application/octet-stream;name=$dowload_name"); //请求范围的度量单位 Header("Accept-Ranges: bytes"); Header('Content-Transfer-Encoding: binary'); $filesize = filesize($file_dir . $file_name); //$header_array = get_headers($filename, true);(网络文件用这个方式获取大小) //$filesize = $header_array['Content-Length']; //Content-Length是指定包含于请求或响应中数据的字节长度 Header("Accept-Length: " . $filesize); //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。 Header("Content-Disposition: attachment; filename=" . basename($dowload_name)); //针对大文件,规定每次读取文件的字节数为10000字节,直接输出数据 $read_buffer = 10000; //读取文件内容并直接输出到浏览器 //总的缓冲的字节数 $sum_buffer = 0; //echo fread ( $file, filesize ( $file_dir . $file_name ) ); //只要没到文件尾,就一直读取 while (!feof($file) && $sum_buffer<$filesize) { echo fread($file, $read_buffer); flush(); //输出缓冲(切记,没有清楚缓存,下载会中断) ob_flush(); $sum_buffer += $read_buffer; } fclose($file); exit(); }
循环时,切记刷新缓存区