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 相关文章推荐
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
深入php list()函数的详解
Jun 05 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
laravel自定义分页效果
Jul 23 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
PHP fopen函数用法实例讲解
Feb 15 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 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
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
实例讲解PHP表单处理
2019/02/15 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
django 简单实现登录验证给你
2019/11/06 Python
简单了解python数组的基本操作
2019/11/26 Python
python创建n行m列数组示例
2019/12/02 Python
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
会计专业毕业生求职信分享
2014/01/03 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
司机职责范本
2014/03/08 职场文书
迎新晚会主持词
2014/03/24 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
专家推荐信怎么写
2015/03/25 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android