PHP -(快上车)- TP3.2 文件下载

本文介绍了一种利用PHP实现文件安全下载的方法,通过fread()函数将文件直接输出到浏览器,确保用户无法获取文件的实际存储位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为项目的需求,使用到PHP文件下载这个功能,通过查阅资料和实际操作完成了下载功能,现在我把研究成果分享给大家

1.根据下载文件的序号来查找,链接的形式如下:
<a href="http://www.xxx.com/download.php?id=123456">点击下载文件</a>  

2.下载原理与实现

例如,需要下载的是一个文件名为xxx.rar的文件,首先创建文件是download.php的PHP文件。通过前面的例子很容易通过文件的ID号从数据库中得到待下载文件的真实位置,在获得文件的真实存储位置后,可以通过header()函数的location参数直接重定向到这个文件。但是这样仍然是不安全的,因为某些下载软件还是可以通过重定向分析获得该文件的位置信息。因此需要用另外一种方法,就是PHP的文件处理API函数。它是通过fread()函数把文件直接输出到浏览器提示用户下载,这样所有的处理都是在服务器端完成的,因此用户就无法获得文件具体存储位置信息的,示例代码如下:

public function download(){
if(IS_GET){
            $id=I('id');  //获取ID
            $res=M('data')->where(['id'=>$id])->find();
            $url=DOWNLOAD.$res['data_path'];  //拼接文件的相对路径
            $name=str_replace(' ','-',$res['data_name']); //下载文件的名称(中间不能留空)
            $size=filesize($url); //文件大小
            if( !$res ){
                header("Content-type: text/html; charset=utf-8");
                echo "
              <html>
                <div>
                    <script>
                    alert('" . $name . "\\n文件不存在!');
                    window.history.go(-1);  //返回上一页
                     </script>
                </div>
              </html>";
            }else{
                Header("content-type: application/octet-stream");
                Header("content-disposition: attachment; filename=".$name);
                Header("content-length: ".$size);
                readfile($url);
            }
        }else{
            return '文件不存在!';
        }
}

上述代码中,程序发送Header信息是用来告诉Apache和浏览器下载文件的相关信息的。content-type的含义代表文件MIME类型是文件流格式。如果在Apache配置里面把文件的MIME类型设为application/octet-stream(如add application/octet-stream .xxx.rar),那么浏览器(客户端)就会知道,这是一个文件流格式的文件并提示用户下载。Accept-Ranges是一个响应头标,它允许服务器指明将在给定的偏移和长度处,为资源组成部分的接受请求,该头标的值被理解为请求范围的度量单位。Content-Length是指定包含于请求或响应中数据的字节长度,例如,Content-Length:382。Content-Disposition:attachment是用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$name该变量的值。

请大家多多支持!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值