php文件下载简易,使用PHP实现文件下载功能

28e8104ae6159516505c4dcdf1b3aaf7.png

我们先来看下载函数的两个形参,function download($file_name,$file_sub_dir)

$filename定义了文件的名称,$file_sub_dir定义了文件的路径名,其格式为“/XXX/”,例如"/file/".

接着用一个变量保存下载文件的路径

$file_path=$_SERVER["DOCUMENT_ROOT"].$file_sub_dir.$file_name;

$_SERVER["DOCUMENT_ROOT"]是服务器的根目录,从根目录开始找代表使用的是绝对路径

然后我们该截取文件的后缀了,如doc、xls、jpg等,这样做的目的是判断根据不同类型的文件使用不同的返回方式。

如jpg则使用header("Content-type:image/jpeg");

二进制文件则使用header("Content-type:Application/octet-stream");

截取后缀用这句$extension=substr($file_name,strrpos($file_name,"."));

strrpos($file_name,".")这个函数的意思是找到后缀前面的小点(.)所在的索引号

substr($file_name,strrpos($file_name,"."))是从索引号开始向后截取

为了让代码更加严谨,还是应该判断一下文件是否存在,不存在则返回

if(!file_exists($file_path)){

echo "文件不存在";

return;

}

这几句是下载的通常写法

//按照字节大小返回

header("Accept-Ranges:bytes");

//返回文件大小

header("Accept-Length:$file_size");

//这里客户端弹出的对话框,对应的文件名

header("Content-Disposition:attachment;filename=".$file_name);

为了缓解压力,最好将数据一点一点读取

$buffer=1024;

$file_count=0;

//这句话用于判断文件是否结束

while(!feof($fp) && ($file_size-$file_count>0)){

$file_data=fread($fp,$buffer);

//统计读了多少个字节

$file_count+=$buffer;

echo $file_data; //将数据完整的输出

}

下面是完整代码

//下载函数

public function download($file_name,$file_sub_dir){

//对中文文件应该进行转码

//$file_name=iconv("utf-8","gb2312",$file_name);

$file_path=$_SERVER["DOCUMENT_ROOT"].$file_sub_dir.$file_name;

$extension=substr($file_name,strrpos($file_name,"."));

if(!file_exists($file_path)){

echo "文件不存在";

return;

}

$fp=fopen($file_path,"r");

//获取下载文件的大小

$file_size=filesize($file_path);

//返回的文件

if($extension==".jpg"){

header("Content-type:image/jpeg");

}else{

header("Content-type:application/octet-stream");

}

//按照字节大小返回

header("Accept-Ranges:bytes");

//返回文件大小

header("Accept-Length:$file_size");

//这里客户端弹出的对话框,对应的文件名

header("Content-Disposition:attachment;filename=".$file_name);

//向客户端回送数据

$buffer=1024;

$file_count=0;

//这句话用于判断文件是否结束

while(!feof($fp) && ($file_size-$file_count>0)){

$file_data=fread($fp,$buffer);

//统计读了多少个字节

$file_count+=$buffer;

echo $file_data; //将数据完整的输出

}

//关闭文件

fclose($fp);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值