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


Posted in PHP onMay 12, 2014

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

<?php
/**
 *
 * 防盗链外部资源下载处理类
 * 
 * @link   http://3water.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://3water.com';
// 许可来路域名列表
$allowUrl = array(
 '3water.com',
);
$BurglarDow = new BurglarDow($dowUrl,$Location,$allowUrl);
$BurglarDow -> dow();
PHP 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
聊天室php&amp;mysql(三)
Oct 09 PHP
用文本文件制作留言板提示(下)
Oct 09 PHP
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
PHP中__get()和__set()的用法实例详解
Jun 04 PHP
php实现根据词频生成tag云的方法
Apr 17 PHP
php数组分页实现方法
Apr 30 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 #PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 #PHP
linux使用crontab实现PHP执行计划定时任务
May 10 #PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 #PHP
php判断电脑访问、手机访问的例子
May 10 #PHP
php计算程序运行时间的简单例子分享
May 10 #PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 #PHP
You might like
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
基于jquery的一个图片hover的插件
2010/04/24 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
Python实现发送email的几种常用方法
2014/08/18 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python subprocess库的使用详解
2018/10/26 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
Python实现FLV视频拼接功能
2020/01/21 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
python中数字是否为可变类型
2020/07/08 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
店长岗位的工作内容
2013/11/12 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
政风行风整改方案
2014/10/25 职场文书
党员承诺书范文2015
2015/04/27 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
python3 字符串str和bytes相互转换
2022/03/23 Python
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers