PHP文件下载文件损坏的问题

functiondownload($file_url,$new_name=''){if(!isset($file_url)||trim($file_url)==''){r... function download($file_url,$new_name=''){
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'); //打开文件
//输出文件内容
echo fread($file_type,filesize($file_url));
fclose($file_type);
}
下载的文件怎么无法打开,提示已损坏!
展开
 我来答
贴吧小官家
2013-12-12 · TA获得超过118个赞
知道答主
回答量:84
采纳率:0%
帮助的人:60.5万
展开全部

经过简单测试,下载大文件(>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  这两个字节

笔刀侠_广州
2013-12-12 · TA获得超过5650个赞
知道大有可为答主
回答量:2002
采纳率:66%
帮助的人:557万
展开全部
下载文件没必要写那么复杂,就下面一行足矣。
echo "<a href='".$file_url."'>点击下载</a>";
追问
绝对路径下载?
追答
怎么是绝对路径呢?不是有变量 $file_url 吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式