• 技术文章 >后端开发 >php教程

    PHP写的资源下载防盗链类分享_PHP

    2016-06-01 11:53:16原创280
    这几天在写一个PHP防盗链外部资源下载处理函数,昨天晚上刚完成编写,中间遇到了些问题,这里就不详述了;
    以下是自写的简单的PHP防盗链处理类(重新整理编写成类文件,以便后期改进);

    复制代码 代码如下:
    /**
    *
    * 防盗链外部资源下载处理类
    *
    * @link http://bitsCN.com
    *
    */
    class BurglarDow{
    /**
    * 初始许可下载状态
    * @var allow
    * @access private
    */
    private $allow = false;
    /**
    * 初始下载地址
    * @var dowUrl
    * @access private
    */
    private $dowUrl = null;
    /**
    * 初始来路域名
    * @var RemoteUrl
    * @access private
    */
    private $RemoteUrl = null;
    /**
    * 初始许可资源取用域名列表
    * @var allowUrl
    * @access private
    */
    private $allowUrl = array();
    /**
    * 初始转跳地址
    * @var Location
    * @access private
    */
    private $Location = null;

    public function __construct($dowUrl,$Location,array $allowUrl){
    // 初始下载地址
    $this->dowUrl = $dowUrl;
    // 初始许可资源取用域名列表
    $this->allowUrl = $allowUrl;
    // 初始转跳地址
    $this->Location = $Location;

    $this->RemoteUrl = @parse_url($_SERVER['HTTP_REFERER']); // 获取来路域名
    if(!is_array($this->RemoteUrl))
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: ".$this->Location);

    if(isset($this->RemoteUrl['host'])){
    if(in_array($this->RemoteUrl['host'],$this->allowUrl)){ // 判断是否来至许可域名
    $this->allow = true; // 下载许可状态为:真
    }
    }
    unset($this->allowUrl,$this->RemoteUrl); // 释放内存变量
    }

    /**
    * 防盗链资源下载
    * @access public
    * @return mixed
    */
    public function dow(){
    $FileInfo = get_headers($this->dowUrl,1); // 获取远程文件头部信息

    if(true === $this->allow){ // 判断是否许可下载资源
    //判断配置文件是否存在
    if(is_file('Config.ini')){
    $FileCon = parse_ini_file('Config.ini');
    }else{
    $FileName = basename($FileInfo['Content-Location']);
    $FileConStr = "FileName = {$FileName}\r\nFileUrl = {$FileInfo['Content-Location']}\r\nFileSize = {$FileInfo['Content-Length']}";
    $handle = fopen ('Config.ini', "wb"); // Config.ini文件不存在则创建文件
    if (fwrite ($handle, $FileConStr) == FALSE) { // 数据写入文件
    echo "File creation failed ...";
    }
    fclose ($handle); // 关闭一个已打开的文件指针
    $FileCon = parse_ini_file('Config.ini');
    }
    if(!empty($$this->dowUrl)){
    $fp = @fopen($$this->dowUrl, "rb"); // 二进制模式读取文件
    if (!$fp)
    exit("Download a mistake.\n\n");

    // 输出远程资源
    header("Content-type:text/html;charset=utf-8");
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$FileCon['FileName']);
    header("Accept-Ranges: bytes");
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Pragma: public');
    header('Content-Length: '.$FileCon['FileSize']);
    while (!feof($fp)){
    set_time_limit(0); // 设置文件最长执行时间
    echo fread($fp, 1024); // 输出文件
    flush(); // 输出缓冲
    ob_flush(); // 输出缓冲区中的内容
    }
    fclose($fp);
    }else{
    header("HTTP/1.1 404 Not Found");
    }
    }else{
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: ".$this->Location);
    }
    }
    }
    // 远程资源地址
    $dowUrl = 'http://dldir1.qq.com/qqfile/qq/QQ5.1/10055/QQ5.1.exe';
    // 转跳地址
    $Location = 'http://bitsCN.com';
    // 许可来路域名列表
    $allowUrl = array(
    'bitsCN.com',
    );
    $BurglarDow = new BurglarDow($dowUrl,$Location,$allowUrl);
    $BurglarDow -> dow();

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 防盗链类
    上一篇:一个简单的PHP验证码实现代码_PHP 下一篇:JS异常处理try..catch语句的作用和实例_PHP
    千万级数据并发解决方案

    相关文章推荐

    • 深入了解PHP反序列化原生类• 带你吃透16个PHP魔术方法• php统计文章排行示例_php实例• 超小PHP小马小结(方便查找后门的朋友)_php实例• 不能上传文件了解决思路
    1/1

    PHP中文网