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

摘自织梦CMS的HTTP文件下载类,第1张

概述介绍《PHP教程:摘自织梦CMS的HTTP文件下载类》开发教程,希望对您有用。

《摘自织梦CMS的http文件下载类》要点:
本文介绍了摘自织梦CMS的http文件下载类,希望对您有用。如果有疑问,可以联系我们。

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

<?PHP if(!defined('DEDEINC')) exit("Request Error!");/** * 织梦http下载类 * * @version  $ID: dedehttpdown.class.PHP 1 11:42 2010年7月6日Z tianya $ * @package  Dedecms.librarIEs * @copyright  copyright (c) 2007 - 2010,DesDev,Inc. * @license  http://help.Dedecms.com/usersguIDe/license.HTML * @link   http://www.Dedecms.com */@set_time_limit(0);class DedehttpDown{ var $m_url = ''; var $m_urlpath = ''; var $m_scheme = 'http'; var $m_host = ''; var $m_port = '80'; var $m_user = ''; var $m_pass = ''; var $m_path = '/'; var $m_query = ''; var $m_fp = ''; var $m_error = ''; var $m_httphead = ''; var $m_HTML = ''; var $m_puthead = ''; var $BaseUrlPath = ''; var $HomeUrl = ''; var $reTry = 0; var $JumpCount = 0; /**  * 初始化系统  *  * @access public  * @param  string $url 需要下载的地址  * @return string  */ function PrivateInit($url) {  if($url=='') {   return ;  }  $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;   }   $this->HomeUrl = $urls["host"];   $this->BaseUrlPath = $this->HomeUrl.$urls["path"];   $this->BaseUrlPath = preg_replace("/\/([^\/]*)\.(.*)$/","/",$this->BaseUrlPath);   $this->BaseUrlPath = preg_replace("/\/$/","",$this->BaseUrlPath);  } } /**  * 重设各参数  *  * @access public  * @return voID  */ function resetAny() {  $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 = ""; } /**  * 打开指定网址  *  * @access public  * @param  string $url 地址  * @param  string $requestType 哀求类型  * @return string  */ function OpenUrl($url,$requestType="GET") {  $this->resetAny();  $this->JumpCount = 0;  $this->m_httphead = Array() ;  $this->m_HTML = '';  $this->reTry = 0;  $this->Close();  //初始化系统  $this->PrivateInit($url);  $this->PrivateStartSession($requestType); } /**  * 转到303重定向网址  *  * @access public  * @param  string $url 地址  * @return string  */ function JumpOpenUrl($url) {  $this->resetAny();  $this->JumpCount++;  $this->m_httphead = Array() ;  $this->m_HTML = "";  $this->Close();  //初始化系统  $this->PrivateInit($url);  $this->PrivateStartSession('GET'); } /**  * 获得某 *** 作错误的原因  *  * @access public  * @return voID  */ function printError() {  echo "错误信息:".$this->m_error;  echo "<br/>具体返回头:<br/>";  foreach($this->m_httphead as $k=>$v){ echo "$k => $v <br/>\r\n"; } } /**  * 判别用Get方法发送的头的应答结果是否正确  *  * @access public  * @return bool  */ function IsGetoK() {  if( preg_match("/^2/",$this->Gethead("http-state")) )  {   return TRUE;  }  else  {   $this->m_error .= $this->Gethead("http-state")." - ".$this->Gethead("http-describe")."<br/>";   return FALSE;  } } /**  * 看看返回的网页是否是text类型  *  * @access public  * @return bool  */ function IsText() {  if( preg_match("/^2/",$this->Gethead("http-state")) && preg_match("/text|xml/i",$this->Gethead("content-type")) )  {   return TRUE;  }  else  {   $this->m_error .= "内容为非文本类型或网址重定向<br/>";   return FALSE;  } } /**  * 判断返回的网页是否是特定的类型  *  * @access public  * @param  string $ctype 内容类型  * @return string  */ function IsContentType($ctype) {  if(preg_match("/^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协议下载文件  *  * @access public  * @param  string $savefilename 保存文件名称  * @return string  */ function SavetoBin($savefilename) {  if(!$this->IsGetoK())  {   return FALSE;  }  if(@feof($this->m_fp))  {   $this->m_error = "连接已经关闭!"; return FALSE;  }  $fp = fopen($savefilename,"w");  while(!feof($this->m_fp))  {   fwrite($fp,fread($this->m_fp,1024));  }  fclose($this->m_fp);  fclose($fp);  return TRUE; } /**  * 保存网页内容为Text文件  *  * @access public  * @param  string $savefilename 保存文件名称  * @return string  */ function SavetoText($savefilename) {  if($this->IsText())  {   $this->SaveBinfile($savefilename);  }  else  {   return "";  } } /**  * 用http协议获得一个网页的内容  *  * @access public  * @return string  */ 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会话  *  * @access public  * @param  string $requestType 哀求类型  * @return string  */ function PrivateStartSession($requestType="GET") {  if(!$this->PrivateOpenHost())  {   $this->m_error .= "打开远程主机出错!";   return FALSE;  }  $this->reTry++;  if($this->Gethead("http-edition")=="http/1.1")  {   $httpv = "http/1.1";  }  else  {   $httpv = "http/1.0";  }  $ps = explode('?',$this->m_urlpath);  $headString = '';  //发送固定的起始哀求头GET、Host信息  if($requestType=="GET")  {   $headString .= "GET ".$this->m_urlpath." $httpv\r\n";  }  else  {   $headString .= "POST ".$ps[0]." $httpv\r\n";  }  $this->m_puthead["Host"] = $this->m_host;  //发送用户自定义的哀求头  if(!isset($this->m_puthead["Accept"]))  {   $this->m_puthead["Accept"] = "*/*";  }  if(!isset($this->m_puthead["User-Agent"]))  {   $this->m_puthead["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 6.0; windows NT 5.2)";  }  if(!isset($this->m_puthead["Refer"]))  {   $this->m_puthead["Refer"] = "http://".$this->m_puthead["Host"];  }  foreach($this->m_puthead as $k=>$v)  {   $k = trim($k);   $v = trim($v);   if($k!=""&&$v!="")   {    $headString .= "$k: $v\r\n";   }  }  fputs($this->m_fp,$headString);  if($requestType=="POST")  {   $postdata = "";   if(count($ps)>1)   {    for($i=1;$i<count($ps);$i++)    {     $postdata .= $ps[$i];    }   }   else   {    $postdata = "OK";   }   $plen = strlen($postdata);   fputs($this->m_fp,"Content-Type: application/x-www-form-urlencoded\r\n");   fputs($this->m_fp,"Content-Length: $plen\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");  }  if($requestType=="POST")  {   fputs($this->m_fp,$postdata);  }  //获取应答头状态信息  $httpstas = explode(" ",fgets($this->m_fp,256));  $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 = trim(fgets($this->m_fp,256));   if($line == "")   {    break;   }   $hkey = "";   $hvalue = "";   $v = 0;   for($i=0;$i<strlen($line);$i++)   {    if($v==1)    {     $hvalue .= $line[$i];    }    if($line[$i]==":")    {     $v = 1;    }    if($v==0)    {     $hkey .= $line[$i];    }   }   $hkey = trim($hkey);   if($hkey!="")   {    $this->m_httphead[strtolower($hkey)] = trim($hvalue);   }  }  //如果连接被不正常关闭,重试  if(feof($this->m_fp))  {   if($this->reTry > 10)   {    return FALSE;   }   $this->PrivateStartSession($requestType);  }  //判断是否是3xx开头的应答  if(preg_match("/^3/",$this->m_httphead["http-state"]))  {   if($this->JumpCount > 3)   {    return;   }   if(isset($this->m_httphead["location"]))   {    $newurl = $this->m_httphead["location"];    if(preg_match("/^http/i",$newurl))    {     $this->JumpOpenUrl($newurl);    }    else    {     $newurl = $this->FillUrl($newurl);     $this->JumpOpenUrl($newurl);    }   }   else   {    $this->m_error = "无法识别的答复!";   }  } } /**  * 获得一个http头的值  *  * @access public  * @param  string $headname 头文件名称  * @return string  */ function Gethead($headname) {  $headname = strtolower($headname);  return isset($this->m_httphead[$headname]) ? $this->m_httphead[$headname] : ''; } /**  * 设置http头的值  *  * @access public  * @param  string $skey 键  * @param  string $svalue 值  * @return string  */ function Sethead($skey,$svalue) {  $this->m_puthead[$skey] = $svalue; } /**  * 打开连接  *  * @access public  * @return bool  */ function PrivateOpenHost() {  if($this->m_host=="")  {   return FALSE;  }  $errno = "";  $errstr = "";  $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;  } } /**  * 关闭连接  *  * @access public  * @return voID  */ function Close() {  @fclose($this->m_fp); } /**  * 补全相对网址  *  * @access public  * @param  string $surl 需要不全的地址  * @return string  */ function FillUrl($surl) {  $i = 0;  $dstr = "";  $pstr = "";  $okurl = "";  $pathStep = 0;  $surl = trim($surl);  if($surl=="")  {   return "";  }  $pos = strpos($surl,"#");  if($pos>0)  {   $surl = substr($surl,$pos);  }  if($surl[0]=="/")  {   $okurl = "http://".$this->HomeUrl.$surl;  }  else if($surl[0]==".")  {   if(strlen($surl)<=1)   {    return "";   }   else if($surl[1]=="/")   {    $okurl = "http://".$this->BaseUrlPath."/".substr($surl,2,strlen($surl)-2);   }   else   {    $urls = explode("/",$surl);    foreach($urls as $u)    {     if($u=="..")     {      $pathStep++;     }     else if($i<count($urls)-1)     {      $dstr .= $urls[$i]."/";     }     else     {      $dstr .= $urls[$i];     }     $i++;    }    $urls = explode("/",$this->BaseUrlPath);    if(count($urls) <= $pathStep)    {     return "";    }    else    {     $pstr = "http://";     for($i=0;$i<count($urls)-$pathStep;$i++)     {      $pstr .= $urls[$i]."/";     }     $okurl = $pstr.$dstr;    }   }  }  else  {   if(strlen($surl)<7)   {    $okurl = "http://".$this->BaseUrlPath."/".$surl;   }   else if(strtolower(substr($surl,7))=="http://")   {    $okurl = $surl;   }   else   {    $okurl = "http://".$this->BaseUrlPath."/".$surl;   }  }  $okurl = preg_replace("/^(http:\/\/)/i",$okurl);  $okurl = preg_replace("/\/{1,}/",$okurl);  return "http://".$okurl; }}//End Class

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

《摘自织梦CMS的http文件下载类》是否对您有启发,欢迎查看更多与《摘自织梦CMS的http文件下载类》相关教程,学精学透。内存溢出 jb51.cc为您提供精彩教程。

总结

以上是内存溢出为你收集整理的摘自织梦CMS的HTTP文件下载类全部内容,希望文章能够帮你解决摘自织梦CMS的HTTP文件下载类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/1007086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存