tp实现文件下载,以及下载图片,报错无法打开图片

临时接到一个需求,需要在一个地方点击可以下载当前文件,所以百度了一个方法,调整了一下,实现了,但是由于不太理解具体的实现方式,留作记录准备以后定时观看,挺实用的一个方法。
定义一个控制器方法
# 下载审核文件
    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);    //关闭这个打开的文件
    }

通过前台点击,访问到这个方法就可实现下载功能。

文件下载失败,有可能是文件路径不对,在输出文件是有空格,目前踩到的一些坑。

经验分享 程序员 微信小程序 职场和发展