此方法为大文件下载的实现,纵然几个G也可实现本地的下载。
可以测试一下,或者等你从中改进...

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

三,PHP扩展类ZipArchive实现压缩Zip文件和文件打包下载

这是一个类,封装了方法,也可以考试测验一下!

php上传打包zipPHP实现下载与紧缩文件的办法的封装与整顿 Ruby

<?php/ 关于文件压缩和下载的类 @author tycell @version 1.0 /class zip_down{ protected $file_path; / 布局函数 @param [string] $path [传入文件目录] / public function __construct($path){ $this->file_path=$path; //要打包的根目录 } / 入口调用函数 @return [type] [以二进制流的形式返回给浏览器下载到本地] / public function index(){ $zip=new ZipArchive(); $end_dir=$this->file_path.date('Ymd',time()).'.zip';//定义打包后的包名 $dir=$this->file_path; if(!is_dir($dir)){ mkdir($dir); } if($zip->open($end_dir, ZipArchive::OVERWRITE) === TRUE){ ///ZipArchive::OVERWRITE 如果文件存在则覆盖 $this->addFileToZip($dir, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的工具通报给方法 $zip->close(); } if(!file_exists($end_dir)){ exit(\"大众无法找到文件\公众); } header(\"大众Cache-Control: public\"大众); header(\公众Content-Description: File Transfer\"大众); header(\"大众Content-Type: application/zip\公众); //zip格式的 header('Content-disposition: attachment; filename='.basename($end_dir)); //文件名 header(\公众Content-Transfer-Encoding: binary\公众); //见告浏览器,这是二进制文件 header('Content-Length:'.filesize($end_dir)); //见告浏览器,文件大小 @readfile($end_dir); $this->delDirAndFile($dir,true);//删除目录和文件 unlink($end_dir);////删除压缩包 } / 文件压缩函数 须要开启php zip扩展 @param [string] $path [路径] @param [object] $zip [扩展ZipArchive类工具] / protected function addFileToZip($path, $zip){ $handler = opendir($path); while (($filename=readdir($handler)) !== false) { if ($filename!= \"大众.\"大众 && $filename!=\"大众..\"大众){ if(!is_dir($filename)){ $zip->addFile($path.\公众/\"大众.$filename,$filename); //第二个参数避免将目录打包,可以不加 } } } @closedir($path); } / 删除文件函数 @param [string] $dir [文件目录] @param boolean $delDir [是否删除目录] @return [type] [description] / protected function delDirAndFile($path,$delDir=true){ $handle=opendir($path); if($handle){ while(false!==($item = readdir($handle))){ if($item!=\公众.\"大众&&$item!=\"大众..\公众){ if(is_dir($path.'/'.$item)){ $this->delDirAndFile($path.'/'.$item, $delDir); }else{ unlink($path.'/'.$item); } } } @closedir($handle); if($delDir){return rmdir($path);} }else{ if(file_exists($path)){ return unlink($path); }else{ return FALSE; } } }}