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 相关文章推荐
简单的页面缓冲技术
Oct 09 PHP
PHP 魔术函数使用说明
May 14 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
Yii清理缓存的方法
Jan 06 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
PHP配置ZendOpcache插件加速
Feb 14 PHP
php变量与字符串的增删改查操作示例
May 07 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图片上传代码
2013/11/04 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
javascript比较文档位置
2008/04/08 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
Python实现全局变量的两个解决方法
2014/07/03 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
python制作小说爬虫实录
2017/08/14 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
彪马日本官网:PUMA日本
2019/01/31 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
拉歌口号大全
2014/06/13 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android