PHP实现的下载远程文件类定义与用法示例


Posted in PHP onJuly 05, 2017

本文实例讲述了PHP实现的下载远程文件类定义与用法。分享给大家供大家参考,具体如下:

<?php
/**
 * 下载远程文件类支持断点续传
 */
class HttpDownload {
  private $m_url = "";
  private $m_urlpath = "";
  private $m_scheme = "http";
  private $m_host = "";
  private $m_port = "80";
  private $m_user = "";
  private $m_pass = "";
  private $m_path = "/";
  private $m_query = "";
  private $m_fp = "";
  private $m_error = "";
  private $m_httphead = "" ;
  private $m_html = "";
  /**
   * 初始化
   */
  public function PrivateInit($url){
    $urls = "";
    $urls = @parse_url($url);
    $this->m_url = $url;
    if(is_array($urls)) {
      $this->m_host = $urls["host"];
      if(!empty($urls["scheme"])) $this->m_scheme = $urls["scheme"];
      if(!empty($urls["user"])) $this->m_user = $urls["user"];
      if(!empty($urls["pass"])) $this->m_pass = $urls["pass"];
      if(!empty($urls["port"])) $this->m_port = $urls["port"];
      if(!empty($urls["path"])) $this->m_path = $urls["path"];
      $this->m_urlpath = $this->m_path;
      if(!empty($urls["query"])) {
        $this->m_query = $urls["query"];
        $this->m_urlpath .= "?".$this->m_query;
      }
    }
  }
  /**
  * 打开指定网址
  */
  function OpenUrl($url) {
    #重设各参数
    $this->m_url = "";
    $this->m_urlpath = "";
    $this->m_scheme = "http";
    $this->m_host = "";
    $this->m_port = "80";
    $this->m_user = "";
    $this->m_pass = "";
    $this->m_path = "/";
    $this->m_query = "";
    $this->m_error = "";
    $this->m_httphead = "" ;
    $this->m_html = "";
    $this->Close();
    #初始化系统
    $this->PrivateInit($url);
    $this->PrivateStartSession();
  }
  /**
  * 获得某操作错误的原因
  */
  public function printError() {
    echo "错误信息:".$this->m_error;
    echo "具体返回头:<br>";
    foreach($this->m_httphead as $k=>$v) {
      echo "$k => $v <br>\r\n";
    }
  }
  /**
  * 判别用Get方法发送的头的应答结果是否正确
  */
  public function IsGetOK() {
    if( ereg("^2",$this->GetHead("http-state")) ) {
      return true;
    } else {
      $this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br>";
      return false;
    }
  }
  /**
  * 看看返回的网页是否是text类型
  */
  public function IsText() {
    if (ereg("^2",$this->GetHead("http-state")) && eregi("^text",$this->GetHead("content-type"))) {
      return true;
    } else {
      $this->m_error .= "内容为非文本类型<br>";
      return false;
    }
  }
  /**
  * 判断返回的网页是否是特定的类型
  */
  public function IsContentType($ctype) {
    if (ereg("^2",$this->GetHead("http-state")) && $this->GetHead("content-type") == strtolower($ctype)) {
      return true;
    } else {
      $this->m_error .= "类型不对 ".$this->GetHead("content-type")."<br>";
      return false;
    }
  }
  /**
  * 用 HTTP 协议下载文件
  */
  public function SaveToBin($savefilename) {
    if (!$this->IsGetOK()) return false;
    if (@feof($this->m_fp)) {
      $this->m_error = "连接已经关闭!";
      return false;
    }
    $fp = fopen($savefilename,"w") or die("写入文件 $savefilename 失败!");
    while (!feof($this->m_fp)) {
      @fwrite($fp,fgets($this->m_fp,256));
    }
    @fclose($this->m_fp);
    return true;
  }
  /**
  * 保存网页内容为 Text 文件
  */
  public function SaveToText($savefilename) {
    if ($this->IsText()) {
      $this->SaveBinFile($savefilename);
    } else {
      return "";
    }
  }
  /**
  * 用 HTTP 协议获得一个网页的内容
  */
  public function GetHtml() {
    if (!$this->IsText()) return "";
    if ($this->m_html!="") return $this->m_html;
    if (!$this->m_fp||@feof($this->m_fp)) return "";
    while(!feof($this->m_fp)) {
      $this->m_html .= fgets($this->m_fp,256);
    }
    @fclose($this->m_fp);
    return $this->m_html;
  }
  /**
  * 开始 HTTP 会话
  */
  public function PrivateStartSession() {
    if (!$this->PrivateOpenHost()) {
      $this->m_error .= "打开远程主机出错!";
      return false;
    }
    if ($this->GetHead("http-edition")=="HTTP/1.1") {
      $httpv = "HTTP/1.1";
    } else {
      $httpv = "HTTP/1.0";
    }
    fputs($this->m_fp,"GET ".$this->m_urlpath." $httpv\r\n");
    fputs($this->m_fp,"Host: ".$this->m_host."\r\n");
    fputs($this->m_fp,"Accept: */*\r\n");
    fputs($this->m_fp,"User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2)\r\n");
    #HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束
    if ($httpv=="HTTP/1.1") {
      fputs($this->m_fp,"Connection: Close\r\n\r\n");
    } else {
      fputs($this->m_fp,"\r\n");
    }
    $httpstas = fgets($this->m_fp,256);
    $httpstas = split(" ",$httpstas);
    $this->m_httphead["http-edition"] = trim($httpstas[0]);
    $this->m_httphead["http-state"] = trim($httpstas[1]);
    $this->m_httphead["http-describe"] = "";
    for ($i=2;$i<count($httpstas);$i++) {
      $this->m_httphead["http-describe"] .= " ".trim($httpstas[$i]);
    }
    while (!feof($this->m_fp)) {
      $line = str_replace("\"","",trim(fgets($this->m_fp,256)));
      if($line == "") break;
      if (ereg(":",$line)) {
        $lines = split(":",$line);
        $this->m_httphead[strtolower(trim($lines[0]))] = trim($lines[1]);
      }
    }
  }
  /**
  * 获得一个Http头的值
  */
  public function GetHead($headname) {
    $headname = strtolower($headname);
    if (isset($this->m_httphead[$headname])) {
      return $this->m_httphead[$headname];
    } else {
      return "";
    }
  }
  /**
  * 打开连接
  */
  public function PrivateOpenHost() {
    if ($this->m_host=="") return false;
    $this->m_fp = @fsockopen($this->m_host, $this->m_port, &$errno, &$errstr,10);
    if (!$this->m_fp){
      $this->m_error = $errstr;
      return false;
    } else {
      return true;
    }
  }
  /**
  * 关闭连接
  */
  public function Close(){
    @fclose($this->m_fp);
  }
}
#两种使用方法,分别如下:
#打开网页
$httpdown = new HttpDownload();
$httpdown->OpenUrl("http://www.google.com.hk");
echo $httpdown->GetHtml();
$httpdown->Close();
#下载文件
$file = new HttpDownload(); # 实例化类
$file->OpenUrl("http://www.ti.com.cn/cn/lit/an/rust020/rust020.pdf"); # 远程文件地址
$file->SaveToBin("rust020.pdf"); # 保存路径及文件名
$file->Close(); # 释放资源
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
十天学会php之第四天
Oct 09 PHP
PHP中上传大体积文件时需要的设置
Oct 09 PHP
php 获取select下拉列表框的值
May 08 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
基于php权限分配的实现代码
Apr 28 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
PHP循环结构实例讲解
Feb 10 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 #PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 #PHP
PHP实现根据密码长度显示安全条
Jul 04 #PHP
PHP截取发动短信内容的方法
Jul 04 #PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 #PHP
一个非常实用的php文件上传类
Jul 04 #PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 #PHP
You might like
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
JavaScript中的History历史对象
2008/01/16 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
js数组去重的hash方法
2016/12/22 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
美国钻石商店:Zales
2016/11/20 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
测绘工程系学生的自我评价
2013/11/30 职场文书
小学校园活动策划
2014/01/30 职场文书
王老吉广告词
2014/03/20 职场文书
股东协议书
2014/04/14 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
公务员考察材料范文
2014/12/23 职场文书
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技
浅析JavaScript中的变量提升
2022/06/01 Javascript