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
杏林同学录(九)
Oct 09 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
分享php邮件管理器源码
Jan 06 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
如何离线执行php任务
Feb 21 PHP
laravel 框架结合关联查询 when()用法分析
Nov 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实现读取和写入tab分割的文件
2015/06/01 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
Smarty3配置及入门语法
2017/02/22 PHP
php工具型代码之印章抠图
2018/07/18 PHP
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
create-react-app安装出错问题解决方法
2018/09/04 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
Python 常用的安装Module方式汇总
2017/05/06 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
冰淇淋开店创业计划书
2014/02/01 职场文书
个人授权委托书范本
2014/04/03 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
实习证明格式范文
2015/06/16 职场文书
Python基础详解之邮件处理
2021/04/28 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL