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

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

Tags: HTTP文件下载类

分享到: