当前位置:首页 > CMS教程 > DeDecms > 列表

摘自织梦CMS的HTTP文件下载类

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-16 10:06:11 浏览: 评论:0 

这篇文章主要介绍了摘自织梦CMS的HTTP文件下载类,涉及php发送http请求、响应、传输等常用操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下。

本文实例讲述了摘自织梦CMS的HTTP文件下载类,分享给大家供大家参考,具体如下:

  1. <?php if(!defined('DEDEINC')) exit("Request Error!"); 
  2. /** 
  3.  * 织梦HTTP下载类 
  4.  * 
  5.  * @version  $Id: dedehttpdown.class.php 1 11:42 2010年7月6日Z tianya $ 
  6.  * @package  DedeCMS.Libraries 
  7.  * @copyright  Copyright (c) 2007 - 2010, DesDev, Inc. 
  8.  * @license  http://help.dedecms.com/usersguide/license.html 
  9.  * @link   http://www.dedecms.com 
  10.  */ 
  11. @set_time_limit(0); 
  12. class DedeHttpDown 
  13. { 
  14.  var $m_url = ''; 
  15.  var $m_urlpath = ''; 
  16.  var $m_scheme = 'http'; 
  17.  var $m_host = ''; 
  18.  var $m_port = '80'; 
  19.  var $m_user = ''; 
  20.  var $m_pass = ''; 
  21.  var $m_path = '/'; 
  22.  var $m_query = ''; 
  23.  var $m_fp = ''; 
  24.  var $m_error = ''; 
  25.  var $m_httphead = ''; 
  26.  var $m_html = ''; 
  27.  var $m_puthead = ''; 
  28.  var $BaseUrlPath = ''; 
  29.  var $HomeUrl = ''; 
  30.  var $reTry = 0; 
  31.  var $JumpCount = 0; 
  32.  /** 
  33.   * 初始化系统 
  34.   * 
  35.   * @access public 
  36.   * @param  string $url 需要下载的地址 
  37.   * @return string 
  38.   */ 
  39.  function PrivateInit($url) 
  40.  { 
  41.   if($url=='') { 
  42.    return ; 
  43.   } 
  44.   $urls = ''; 
  45.   $urls = @parse_url($url); 
  46.   $this->m_url = $url; 
  47.   if(is_array($urls)) 
  48.   { 
  49.    $this->m_host = $urls["host"]; 
  50.    if(!emptyempty($urls["scheme"])) 
  51.    { 
  52.     $this->m_scheme = $urls["scheme"]; 
  53.    } 
  54.    if(!emptyempty($urls["user"])) 
  55.    { 
  56.     $this->m_user = $urls["user"]; 
  57.    } 
  58.    if(!emptyempty($urls["pass"])) 
  59.    { 
  60.     $this->m_pass = $urls["pass"]; 
  61.    } 
  62.    if(!emptyempty($urls["port"])) 
  63.    { 
  64.     $this->m_port = $urls["port"]; 
  65.    } 
  66.    if(!emptyempty($urls["path"])) 
  67.    { 
  68.     $this->m_path = $urls["path"]; 
  69.    } 
  70.    $this->m_urlpath = $this->m_path; 
  71.    if(!emptyempty($urls["query"])) 
  72.    { 
  73.     $this->m_query = $urls["query"]; 
  74.     $this->m_urlpath .= "?".$this->m_query; 
  75.    } 
  76.    $this->HomeUrl = $urls["host"]; 
  77.    $this->BaseUrlPath = $this->HomeUrl.$urls["path"]; 
  78.    $this->BaseUrlPath = preg_replace("/\/([^\/]*)\.(.*)$/","/",$this->BaseUrlPath); 
  79.    $this->BaseUrlPath = preg_replace("/\/$/","",$this->BaseUrlPath); 
  80.   } 
  81.  } 
  82.  /** 
  83.   * 重设各参数 
  84.   * 
  85.   * @access public 
  86.   * @return void 
  87.   */ 
  88.  function ResetAny() 
  89.  { 
  90.   $this->m_url = ""; 
  91.   $this->m_urlpath = ""; 
  92.   $this->m_scheme = "http"; 
  93.   $this->m_host = ""; 
  94.   $this->m_port = "80"; 
  95.   $this->m_user = ""; 
  96.   $this->m_pass = ""; 
  97.   $this->m_path = "/"; 
  98.   $this->m_query = ""; 
  99.   $this->m_error = ""; 
  100.  } 
  101.  /** 
  102.   * 打开指定网址 
  103.   * 
  104.   * @access public 
  105.   * @param  string $url 地址 
  106.   * @param  string $requestType 请求类型 
  107.   * @return string 
  108.   */ 
  109.  function OpenUrl($url,$requestType="GET") 
  110.  { 
  111.   $this->ResetAny(); 
  112.   $this->JumpCount = 0; 
  113.   $this->m_httphead = Array() ; 
  114.   $this->m_html = ''; 
  115.   $this->reTry = 0; 
  116.   $this->Close(); 
  117.   //初始化系统 
  118.   $this->PrivateInit($url); 
  119.   $this->PrivateStartSession($requestType); 
  120.  } 
  121.  /** 
  122.   * 转到303重定向网址 
  123.   * 
  124.   * @access public 
  125.   * @param  string $url 地址 
  126.   * @return string 
  127.   */ 
  128.  function JumpOpenUrl($url) 
  129.  { 
  130.   $this->ResetAny(); 
  131.   $this->JumpCount++; 
  132.   $this->m_httphead = Array() ; 
  133.   $this->m_html = ""; 
  134.   $this->Close(); 
  135.   //初始化系统 
  136.   $this->PrivateInit($url); 
  137.   $this->PrivateStartSession('GET'); 
  138.  } 
  139.  /** 
  140.   * 获得某操作错误的原因 
  141.   * 
  142.   * @access public 
  143.   * @return void 
  144.   */ 
  145.  function printError() 
  146.  { 
  147.   echo "错误信息:".$this->m_error; 
  148.   echo "<br/>具体返回头:<br/>"; 
  149.   foreach($this->m_httphead as $k=>$v){ echo "$k => $v <br/>\r\n"; } 
  150.  } 
  151.  /** 
  152.   * 判别用Get方法发送的头的应答结果是否正确 
  153.   * 
  154.   * @access public 
  155.   * @return bool 
  156.   */ 
  157.  function IsGetOK() 
  158.  { 
  159.   if( preg_match("/^2/",$this->GetHead("http-state")) ) 
  160.   { 
  161.    return TRUE; 
  162.   } 
  163.   else 
  164.   { 
  165.    $this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br/>"; 
  166.    return FALSE; 
  167.   } 
  168.  } 
  169.  /** 
  170.   * 看看返回的网页是否是text类型 
  171.   * 
  172.   * @access public 
  173.   * @return bool 
  174.   */ 
  175.  function IsText() 
  176.  { 
  177.   if( preg_match("/^2/",$this->GetHead("http-state")) && preg_match("/text|xml/i",$this->GetHead("content-type")) ) 
  178.   { 
  179.    return TRUE; 
  180.   } 
  181.   else 
  182.   { 
  183.    $this->m_error .= "内容为非文本类型或网址重定向<br/>"; 
  184.    return FALSE; 
  185.   } 
  186.  } 
  187.  /** 
  188.   * 判断返回的网页是否是特定的类型 
  189.   * 
  190.   * @access public 
  191.   * @param  string $ctype 内容类型 
  192.   * @return string 
  193.   */ 
  194.  function IsContentType($ctype) 
  195.  { 
  196.   if(preg_match("/^2/",$this->GetHead("http-state")) 
  197.   && $this->GetHead("content-type")==strtolower($ctype)) 
  198.   { return TRUE; } 
  199.   else 
  200.   { 
  201.    $this->m_error .= "类型不对 ".$this->GetHead("content-type")."<br/>"; 
  202.    return FALSE; 
  203.   } 
  204.  } 
  205.  /** 
  206.   * 用Http协议下载文件 
  207.   * 
  208.   * @access public 
  209.   * @param  string $savefilename 保存文件名称 
  210.   * @return string 
  211.   */ 
  212.  function SaveToBin($savefilename) 
  213.  { 
  214.   if(!$this->IsGetOK()) 
  215.   { 
  216.    return FALSE; 
  217.   } 
  218.   if(@feof($this->m_fp)) 
  219.   { 
  220.    $this->m_error = "连接已经关闭!"; return FALSE; 
  221.   } 
  222.   $fp = fopen($savefilename,"w"); 
  223.   while(!feof($this->m_fp)) 
  224.   { 
  225.    fwrite($fp, fread($this->m_fp, 1024)); 
  226.   } 
  227.   fclose($this->m_fp); 
  228.   fclose($fp); 
  229.   return TRUE; 
  230.  } 
  231.  /** 
  232.   * 保存网页内容为Text文件 
  233.   * 
  234.   * @access public 
  235.   * @param  string $savefilename 保存文件名称 
  236.   * @return string 
  237.   */ 
  238.  function SaveToText($savefilename) 
  239.  { 
  240.   if($this->IsText()) 
  241.   { 
  242.    $this->SaveBinFile($savefilename); 
  243.   } 
  244.   else 
  245.   { 
  246.    return ""; 
  247.   } 
  248.  } 
  249.  /** 
  250.   * 用Http协议获得一个网页的内容 
  251.   * 
  252.   * @access public 
  253.   * @return string 
  254.   */ 
  255.  function GetHtml() 
  256.  { 
  257.   if(!$this->IsText()) 
  258.   { 
  259.    return ''; 
  260.   } 
  261.   if($this->m_html!='') 
  262.   { 
  263.    return $this->m_html; 
  264.   } 
  265.   if(!$this->m_fp||@feof($this->m_fp)) 
  266.   { 
  267.    return ''; 
  268.   } 
  269.   while(!feof($this->m_fp)) 
  270.   { 
  271.    $this->m_html .= fgets($this->m_fp,256); 
  272.   } 
  273.   @fclose($this->m_fp); 
  274.   return $this->m_html; 
  275.  } 
  276.  /** 
  277.   * 开始HTTP会话 
  278.   * 
  279.   * @access public 
  280.   * @param  string $requestType 请求类型 
  281.   * @return string 
  282.   */ 
  283.  function PrivateStartSession($requestType="GET") 
  284.  { 
  285.   if(!$this->PrivateOpenHost()) 
  286.   { 
  287.    $this->m_error .= "打开远程主机出错!"; 
  288.    return FALSE; 
  289.   } 
  290.   $this->reTry++; 
  291.   if($this->GetHead("http-edition")=="HTTP/1.1") 
  292.   { 
  293.    $httpv = "HTTP/1.1"; 
  294.   } 
  295.   else 
  296.   { 
  297.    $httpv = "HTTP/1.0"; 
  298.   } 
  299.   $ps = explode('?',$this->m_urlpath); 
  300.   $headString = ''; 
  301.   //发送固定的起始请求头GET、Host信息 
  302.   if($requestType=="GET") 
  303.   { 
  304.    $headString .= "GET ".$this->m_urlpath." $httpv\r\n"; 
  305.   } 
  306.   else 
  307.   { 
  308.    $headString .= "POST ".$ps[0]." $httpv\r\n"; 
  309.   } 
  310.   $this->m_puthead["Host"] = $this->m_host; 
  311.   //发送用户自定义的请求头 
  312.   if(!isset($this->m_puthead["Accept"])) 
  313.   { 
  314.    $this->m_puthead["Accept"] = "*/*"; 
  315.   } 
  316.   if(!isset($this->m_puthead["User-Agent"])) 
  317.   { 
  318.    $this->m_puthead["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)"; 
  319.   } 
  320.   if(!isset($this->m_puthead["Refer"])) 
  321.   { 
  322.    $this->m_puthead["Refer"] = "http://".$this->m_puthead["Host"]; 
  323.   } 
  324.   foreach($this->m_puthead as $k=>$v) 
  325.   { 
  326.    $k = trim($k); 
  327.    $v = trim($v); 
  328.    if($k!=""&&$v!="") 
  329.    { 
  330.     $headString .= "$k: $v\r\n"; 
  331.    } 
  332.   } 
  333.   fputs($this->m_fp, $headString); 
  334.   if($requestType=="POST") 
  335.   { 
  336.    $postdata = ""; 
  337.    if(count($ps)>1) 
  338.    { 
  339.     for($i=1;$i<count($ps);$i++) 
  340.     { 
  341.      $postdata .= $ps[$i]; 
  342.     } 
  343.    } 
  344.    else 
  345.    { 
  346.     $postdata = "OK"; 
  347.    } 
  348.    $plen = strlen($postdata); 
  349.    fputs($this->m_fp,"Content-Type: application/x-www-form-urlencoded\r\n"); 
  350.    fputs($this->m_fp,"Content-Length: $plen\r\n"); 
  351.   } 
  352.   //发送固定的结束请求头 
  353.   //HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束 
  354.   if($httpv=="HTTP/1.1") 
  355.   { 
  356.    fputs($this->m_fp,"Connection: Close\r\n\r\n"); 
  357.   } 
  358.   else 
  359.   { 
  360.    fputs($this->m_fp,"\r\n"); 
  361.   } 
  362.   if($requestType=="POST") 
  363.   { 
  364.    fputs($this->m_fp,$postdata); 
  365.   } 
  366.   //获取应答头状态信息 
  367.   $httpstas = explode(" ",fgets($this->m_fp,256)); 
  368.   $this->m_httphead["http-edition"] = trim($httpstas[0]); 
  369.   $this->m_httphead["http-state"] = trim($httpstas[1]); 
  370.   $this->m_httphead["http-describe"] = ""; 
  371.   for($i=2;$i<count($httpstas);$i++) 
  372.   { 
  373.    $this->m_httphead["http-describe"] .= " ".trim($httpstas[$i]); 
  374.   } 
  375.   //获取详细应答头 
  376.   while(!feof($this->m_fp)) 
  377.   { 
  378.    $line = trim(fgets($this->m_fp,256)); 
  379.    if($line == "") 
  380.    { 
  381.     break; 
  382.    } 
  383.    $hkey = ""; 
  384.    $hvalue = ""; 
  385.    $v = 0; 
  386.    for($i=0;$i<strlen($line);$i++) 
  387.    { 
  388.     if($v==1) 
  389.     { 
  390.      $hvalue .= $line[$i]; 
  391.     } 
  392.     if($line[$i]==":") 
  393.     { 
  394.      $v = 1; 
  395.     } 
  396.     if($v==0) 
  397.     { 
  398.      $hkey .= $line[$i]; 
  399.     } 
  400.    } 
  401.    $hkey = trim($hkey); 
  402.    if($hkey!="") 
  403.    { 
  404.     $this->m_httphead[strtolower($hkey)] = trim($hvalue); 
  405.    } 
  406.   } 
  407.   //如果连接被不正常关闭,重试 
  408.   if(feof($this->m_fp)) 
  409.   { 
  410.    if($this->reTry > 10) 
  411.    { 
  412.     return FALSE; 
  413.    } 
  414.    $this->PrivateStartSession($requestType); 
  415.   } 
  416.   //判断是否是3xx开头的应答 
  417.   if(preg_match("/^3/",$this->m_httphead["http-state"])) 
  418.   { 
  419.    if($this->JumpCount > 3) 
  420.    { 
  421.     return; 
  422.    } 
  423.    if(isset($this->m_httphead["location"])) 
  424.    { 
  425.     $newurl = $this->m_httphead["location"]; 
  426.     if(preg_match("/^http/i",$newurl)) 
  427.     { 
  428.      $this->JumpOpenUrl($newurl); 
  429.     } 
  430.     else 
  431.     { 
  432.      $newurl = $this->FillUrl($newurl); 
  433.      $this->JumpOpenUrl($newurl); 
  434.     } 
  435.    } 
  436.    else 
  437.    { 
  438.     $this->m_error = "无法识别的答复!"; 
  439.    } 
  440.   } 
  441.  } 
  442.  /** 
  443.   * 获得一个Http头的值 
  444.   * 
  445.   * @access public 
  446.   * @param  string $headname 头文件名称 
  447.   * @return string 
  448.   */ 
  449.  function GetHead($headname) 
  450.  { 
  451.   $headname = strtolower($headname); 
  452.   return isset($this->m_httphead[$headname]) ? $this->m_httphead[$headname] : ''; 
  453.  } 
  454.  /** 
  455.   * 设置Http头的值 
  456.   * 
  457.   * @access public 
  458.   * @param  string $skey 键 
  459.   * @param  string $svalue 值 
  460.   * @return string 
  461.   */ 
  462.  function SetHead($skey,$svalue) 
  463.  { 
  464.   $this->m_puthead[$skey] = $svalue; 
  465.  } 
  466.  /** 
  467.   * 打开连接 
  468.   * 
  469.   * @access public 
  470.   * @return bool 
  471.   */ 
  472.  function PrivateOpenHost() 
  473.  { 
  474.   if($this->m_host=="") 
  475.   { 
  476.    return FALSE; 
  477.   } 
  478.   $errno = ""; 
  479.   $errstr = ""; 
  480.   $this->m_fp = @fsockopen($this->m_host, $this->m_port, $errno, $errstr,10); 
  481.   if(!$this->m_fp) 
  482.   { 
  483.    $this->m_error = $errstr; 
  484.    return FALSE; 
  485.   } 
  486.   else 
  487.   { 
  488.    return TRUE; 
  489.   } 
  490.  } 
  491.  /** 
  492.   * 关闭连接 
  493.   * 
  494.   * @access public 
  495.   * @return void 
  496.   */ 
  497.  function Close() 
  498.  { 
  499.   @fclose($this->m_fp); 
  500.  } 
  501.  /** 
  502.   * 补全相对网址 
  503.   * 
  504.   * @access public 
  505.   * @param  string $surl 需要不全的地址 
  506.   * @return string 
  507.   */ 
  508.  function FillUrl($surl) 
  509.  { 
  510.   $i = 0; 
  511.   $dstr = ""; 
  512.   $pstr = ""; 
  513.   $okurl = ""; 
  514.   $pathStep = 0; 
  515.   $surl = trim($surl); 
  516.   if($surl=="") 
  517.   { 
  518.    return ""; 
  519.   } 
  520.   $pos = strpos($surl,"#"); 
  521.   if($pos>0) 
  522.   { 
  523.    $surl = substr($surl,0,$pos); 
  524.   } 
  525.   if($surl[0]=="/") 
  526.   { 
  527.    $okurl = "http://".$this->HomeUrl.$surl; 
  528.   } 
  529.   else if($surl[0]==".") 
  530.   { 
  531.    if(strlen($surl)<=1) 
  532.    { 
  533.     return ""; 
  534.    } 
  535.    else if($surl[1]=="/") 
  536.    { 
  537.     $okurl = "http://".$this->BaseUrlPath."/".substr($surl,2,strlen($surl)-2); 
  538.    } 
  539.    else 
  540.    { 
  541.     $urls = explode("/",$surl); 
  542.     foreach($urls as $u) 
  543.     { 
  544.      if($u=="..") 
  545.      { 
  546.       $pathStep++; 
  547.      } 
  548.      else if($i<count($urls)-1) 
  549.      { 
  550.       $dstr .= $urls[$i]."/"; 
  551.      } 
  552.      else 
  553.      { 
  554.       $dstr .= $urls[$i]; 
  555.      } 
  556.      $i++; 
  557.     } 
  558.     $urls = explode("/",$this->BaseUrlPath); 
  559.     if(count($urls) <= $pathStep) 
  560.     { 
  561.      return ""; 
  562.     } 
  563.     else 
  564.     { 
  565.      $pstr = "http://"; 
  566.      for($i=0;$i<count($urls)-$pathStep;$i++) 
  567.      { 
  568.       $pstr .= $urls[$i]."/"; 
  569.      } 
  570.      $okurl = $pstr.$dstr; 
  571.     } 
  572.    } 
  573.   } 
  574.   else 
  575.   { 
  576.    if(strlen($surl)<7) 
  577.    { 
  578.     $okurl = "http://".$this->BaseUrlPath."/".$surl; 
  579.    } 
  580.    else if(strtolower(substr($surl,0,7))=="http://") 
  581.    { 
  582.     $okurl = $surl; 
  583.    } 
  584.    else 
  585.    { 
  586.     $okurl = "http://".$this->BaseUrlPath."/".$surl; 
  587.    } 
  588.   } 
  589.   $okurl = preg_replace("/^(http:\/\/)/i","",$okurl); 
  590.   $okurl = preg_replace("/\/{1,}/", "/", $okurl); 
  591.   return "http://".$okurl; 
  592.  } 
  593. }//End Class 

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

Tags: HTTP文件下载类

分享到: