经过简单测试,下载大文件(>50M)时会出现,断节问题,还有对中文名字的文件支持不好,甚至返回404,下载的文件打不开也许是因为没有判断是否读取完,因为 fread不一定能一次性将一个文件读入内存,这样服务器有压力,服务器为了稳定可能对该内存区进行了优化,下面贴上我修改的代码,写的不好望指正,共同进步:
function download($file_url,$new_name=''){ $file_url=iconv('utf-8','gb2312',$file_url); //将编码转为支持中英文的gb2312编码 if(!isset($file_url)||trim($file_url)==''){ return '500'; } if(!file_exists($file_url)){ //检查文件是否存在 return '404'; } $file_name=basename($file_url); $file_type=explode('.',$file_url); $file_type=$file_type[count($file_type)-1]; $file_name=trim($new_name=='')?$file_name:urlencode($new_name).'.'. $file_type; //输入文件标签 header("Content-type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Accept-Length: ".filesize($file_url)); header("Content-Disposition: attachment; filename=".$file_name); $file_type=fopen($file_url,'r'); //打开文件 //输出文件内容 $file_size=filesize($file_url);//获取文件大小 $buffer=1024; //定义1KB的缓存空间 $file_count=0; //计数器,计算发送了多少数据 while(!feof($file_type) && ($file_size>$file_count)){ //如果文件还没读到结尾,且还有数据没有发送 $senddata=fread($file_type,$buffer); //读取文件内容到缓存区 $file_count+=$senddata; echo $senddata; } //echo fread($file_type,filesize($file_url)); fclose($file_type); } //最主要的原因找到了,保存PHP源码时要用UTF-8 无ROM格式编码保存,否则每个文件头部都会有 EF BB 这两个字节。