临时接到一个需求,需要在一个地方点击可以下载当前文件,所以百度了一个方法,调整了一下,实现了,但是由于不太理解具体的实现方式,留作记录准备以后定时观看,挺实用的一个方法。
定义一个控制器方法
# 下载审核文件
public function down(Request $request)
{
# 获取前台传递数据
$data = $request->param();
# 使用ajax请求判断当前文件是否存在,如果存在则发送一个get请求,还是请求这个方法
if($request->isAjax()){
# 判断当前文件是否存在
$events = appadminmodelEvents::where(id,$data[e_id])->field(fileevents)->find();
if(empty($events[fileevents])){
return json([code => 100,msg => 当前审核文件不存在]);
}
return json([code => 200,msg => ]);
}
# 如果存在 会发送一个 get请求到这个方法中
$events = appadminmodelEvents::where(id,$data[e_id])->field(fileevents)->find();
header("Content-type:text/html;charset=utf-8");
$file_name = $events[fileevents]; // 根据id获取存储在数据库中的路径地址
$file_name = iconv("utf-8","gb2312",$file_name); // 转换编码
$file_sub_path = ROOT_PATH . /public/; //确保文件在这个路径下面,换成你文件所在的路径
$file_path = $file_sub_path . $file_name;
# 将反斜杠 替换成正斜杠
$file_path = str_replace(\,/,$file_path);
if(!file_exists($file_path)){
echo "下载文件不存在!";exit; //如果提示这个错误,很可能你的路径不对,可以打印$file_sub_path查看
}
$fp = fopen($file_path,"r"); // 以可读的方式打开这个文件
# 如果出现图片无法打开,可以在这个位置添加函数
ob_clean(); # 清空擦掉,输出缓冲区。
$file_size = filesize($file_path);
//下载文件需要用到的头
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_count<$file_size){
$file_con = fread($fp,$buffer);
$file_count += $buffer;
echo $file_con;
}
fclose($fp); //关闭这个打开的文件
}
通过前台点击,访问到这个方法就可实现下载功能。
文件下载失败,有可能是文件路径不对,在输出文件是有空格,目前踩到的一些坑。