首页 > 开发 > PHP > 正文

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

2024-05-04 23:38:38
字体:
来源:转载
供稿:网友

这篇文章主要介绍了摘自织梦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. if($url=='') { 
  40. return ; 
  41. $urls = ''
  42. $urls = @parse_url($url); 
  43. $this->m_url = $url
  44. if(is_array($urls)) 
  45. $this->m_host = $urls["host"]; 
  46. if(!emptyempty($urls["scheme"])) 
  47. $this->m_scheme = $urls["scheme"]; 
  48. if(!emptyempty($urls["user"])) 
  49. $this->m_user = $urls["user"]; 
  50. if(!emptyempty($urls["pass"])) 
  51. $this->m_pass = $urls["pass"]; 
  52. if(!emptyempty($urls["port"])) 
  53. $this->m_port = $urls["port"]; 
  54. if(!emptyempty($urls["path"])) 
  55. $this->m_path = $urls["path"]; 
  56. $this->m_urlpath = $this->m_path; 
  57. if(!emptyempty($urls["query"])) 
  58. $this->m_query = $urls["query"]; 
  59. $this->m_urlpath .= "?".$this->m_query; 
  60. $this->HomeUrl = $urls["host"]; 
  61. $this->BaseUrlPath = $this->HomeUrl.$urls["path"]; 
  62. $this->BaseUrlPath = preg_replace("///([^//]*)/.(.*)$/","/",$this->BaseUrlPath); 
  63. $this->BaseUrlPath = preg_replace("///$/","",$this->BaseUrlPath); 
  64. /** 
  65. * 重设各参数 
  66. * 
  67. * @access public 
  68. * @return void 
  69. */ 
  70. function ResetAny() 
  71. $this->m_url = ""
  72. $this->m_urlpath = ""
  73. $this->m_scheme = "http"
  74. $this->m_host = ""
  75. $this->m_port = "80"
  76. $this->m_user = ""
  77. $this->m_pass = ""
  78. $this->m_path = "/"
  79. $this->m_query = ""
  80. $this->m_error = ""
  81. /** 
  82. * 打开指定网址 
  83. * 
  84. * @access public 
  85. * @param string $url 地址 
  86. * @param string $requestType 请求类型 
  87. * @return string 
  88. */ 
  89. function OpenUrl($url,$requestType="GET"
  90. $this->ResetAny(); 
  91. $this->JumpCount = 0; 
  92. $this->m_httphead = Array() ; 
  93. $this->m_html = ''
  94. $this->reTry = 0; 
  95. $this->Close(); 
  96. //初始化系统 
  97. $this->PrivateInit($url); 
  98. $this->PrivateStartSession($requestType); 
  99. /** 
  100. * 转到303重定向网址 
  101. * 
  102. * @access public 
  103. * @param string $url 地址 
  104. * @return string 
  105. */ 
  106. function JumpOpenUrl($url
  107. $this->ResetAny(); 
  108. $this->JumpCount++; 
  109. $this->m_httphead = Array() ; 
  110. $this->m_html = ""
  111. $this->Close(); 
  112. //初始化系统 
  113. $this->PrivateInit($url); 
  114. $this->PrivateStartSession('GET'); 
  115. /** 
  116. * 获得某操作错误的原因 
  117. * 
  118. * @access public 
  119. * @return void 
  120. */ 
  121. function printError() 
  122. echo "错误信息:".$this->m_error; 
  123. echo "<br/>具体返回头:<br/>"
  124. foreach($this->m_httphead as $k=>$v){ echo "$k => $v <br/>/r/n"; } 
  125. /** 
  126. * 判别用Get方法发送的头的应答结果是否正确 
  127. * 
  128. * @access public 
  129. * @return bool 
  130. */ 
  131. function IsGetOK() 
  132. if( preg_match("/^2/",$this->GetHead("http-state")) ) 
  133. return TRUE; 
  134. else 
  135. $this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br/>"
  136. return FALSE; 
  137. /** 
  138. * 看看返回的网页是否是text类型 
  139. * 
  140. * @access public 
  141. * @return bool 
  142. */ 
  143. function IsText() 
  144. if( preg_match("/^2/",$this->GetHead("http-state")) && preg_match("/text|xml/i",$this->GetHead("content-type")) ) 
  145. return TRUE; 
  146. else 
  147. $this->m_error .= "内容为非文本类型或网址重定向<br/>"
  148. return FALSE; 
  149. /** 
  150. * 判断返回的网页是否是特定的类型 
  151. * 
  152. * @access public 
  153. * @param string $ctype 内容类型 
  154. * @return string 
  155. */ 
  156. function IsContentType($ctype
  157. if(preg_match("/^2/",$this->GetHead("http-state")) 
  158. && $this->GetHead("content-type")==strtolower($ctype)) 
  159. return TRUE; } 
  160. else 
  161. $this->m_error .= "类型不对 ".$this->GetHead("content-type")."<br/>"
  162. return FALSE; 
  163. /** 
  164. * 用Http协议下载文件 
  165. * 
  166. * @access public 
  167. * @param string $savefilename 保存文件名称 
  168. * @return string 
  169. */ 
  170. function SaveToBin($savefilename
  171. if(!$this->IsGetOK()) 
  172. return FALSE; 
  173. if(@feof($this->m_fp)) 
  174. $this->m_error = "连接已经关闭!"return FALSE; 
  175. $fp = fopen($savefilename,"w"); 
  176. while(!feof($this->m_fp)) 
  177. fwrite($fpfread($this->m_fp, 1024)); 
  178. fclose($this->m_fp); 
  179. fclose($fp); 
  180. return TRUE; 
  181. /** 
  182. * 保存网页内容为Text文件 
  183. * 
  184. * @access public 
  185. * @param string $savefilename 保存文件名称 
  186. * @return string 
  187. */ 
  188. function SaveToText($savefilename
  189. if($this->IsText()) 
  190. $this->SaveBinFile($savefilename); 
  191. else 
  192. return ""
  193. /** 
  194. * 用Http协议获得一个网页的内容 
  195. * 
  196. * @access public 
  197. * @return string 
  198. */ 
  199. function GetHtml() 
  200. if(!$this->IsText()) 
  201. return ''
  202. if($this->m_html!=''
  203. return $this->m_html; 
  204. if(!$this->m_fp||@feof($this->m_fp)) 
  205. return ''
  206. while(!feof($this->m_fp)) 
  207. $this->m_html .= fgets($this->m_fp,256); 
  208. @fclose($this->m_fp); 
  209. return $this->m_html; 
  210. /** 
  211. * 开始HTTP会话 
  212. * 
  213. * @access public 
  214. * @param string $requestType 请求类型 
  215. * @return string 
  216. */ 
  217. function PrivateStartSession($requestType="GET"
  218. if(!$this->PrivateOpenHost()) 
  219. $this->m_error .= "打开远程主机出错!"
  220. return FALSE; 
  221. $this->reTry++; 
  222. if($this->GetHead("http-edition")=="HTTP/1.1"
  223. $httpv = "HTTP/1.1"
  224. else 
  225. $httpv = "HTTP/1.0"
  226. $ps = explode('?',$this->m_urlpath); 
  227. $headString = ''
  228. //发送固定的起始请求头GET、Host信息 
  229. if($requestType=="GET"
  230. $headString .= "GET ".$this->m_urlpath." $httpv/r/n"
  231. else 
  232. $headString .= "POST ".$ps[0]." $httpv/r/n"
  233. $this->m_puthead["Host"] = $this->m_host; 
  234. //发送用户自定义的请求头 
  235. if(!isset($this->m_puthead["Accept"])) 
  236. $this->m_puthead["Accept"] = "*/*"
  237. if(!isset($this->m_puthead["User-Agent"])) 
  238. $this->m_puthead["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)"
  239. if(!isset($this->m_puthead["Refer"])) 
  240. $this->m_puthead["Refer"] = "http://".$this->m_puthead["Host"]; 
  241. foreach($this->m_puthead as $k=>$v
  242. $k = trim($k); 
  243. $v = trim($v); 
  244. if($k!=""&&$v!=""
  245. $headString .= "$k: $v/r/n"
  246. fputs($this->m_fp, $headString); 
  247. if($requestType=="POST"
  248. $postdata = ""
  249. if(count($ps)>1) 
  250. for($i=1;$i<count($ps);$i++) 
  251. $postdata .= $ps[$i]; 
  252. else 
  253. $postdata = "OK"
  254. $plen = strlen($postdata); 
  255. fputs($this->m_fp,"Content-Type: application/x-www-form-urlencoded/r/n"); 
  256. fputs($this->m_fp,"Content-Length: $plen/r/n"); 
  257. //发送固定的结束请求头 
  258. //HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束 
  259. if($httpv=="HTTP/1.1"
  260. fputs($this->m_fp,"Connection: Close/r/n/r/n"); 
  261. else 
  262. fputs($this->m_fp,"/r/n"); 
  263. if($requestType=="POST"
  264. fputs($this->m_fp,$postdata); 
  265. //获取应答头状态信息 
  266. $httpstas = explode(" ",fgets($this->m_fp,256)); 
  267. $this->m_httphead["http-edition"] = trim($httpstas[0]); 
  268. $this->m_httphead["http-state"] = trim($httpstas[1]); 
  269. $this->m_httphead["http-describe"] = ""
  270. for($i=2;$i<count($httpstas);$i++) 
  271. $this->m_httphead["http-describe"] .= " ".trim($httpstas[$i]); 
  272. //获取详细应答头 
  273. while(!feof($this->m_fp)) 
  274. $line = trim(fgets($this->m_fp,256)); 
  275. if($line == ""
  276. break
  277. $hkey = ""
  278. $hvalue = ""
  279. $v = 0; 
  280. for($i=0;$i<strlen($line);$i++) 
  281. if($v==1) 
  282. $hvalue .= $line[$i]; 
  283. if($line[$i]==":"
  284. $v = 1; 
  285. if($v==0) 
  286. $hkey .= $line[$i]; 
  287. $hkey = trim($hkey); 
  288. if($hkey!=""
  289. $this->m_httphead[strtolower($hkey)] = trim($hvalue); 
  290. //如果连接被不正常关闭,重试 
  291. if(feof($this->m_fp)) 
  292. if($this->reTry > 10) 
  293. return FALSE; 
  294. $this->PrivateStartSession($requestType); 
  295. //判断是否是3xx开头的应答 
  296. if(preg_match("/^3/",$this->m_httphead["http-state"])) 
  297. if($this->JumpCount > 3) 
  298. return
  299. if(isset($this->m_httphead["location"])) 
  300. $newurl = $this->m_httphead["location"]; 
  301. if(preg_match("/^http/i",$newurl)) 
  302. $this->JumpOpenUrl($newurl); 
  303. else 
  304. $newurl = $this->FillUrl($newurl); 
  305. $this->JumpOpenUrl($newurl); 
  306. else 
  307. $this->m_error = "无法识别的答复!"
  308. /** 
  309. * 获得一个Http头的值 
  310. * @access public 
  311. * @param string $headname 头文件名称 
  312. * @return string 
  313. */ 
  314. function GetHead($headname
  315. $headname = strtolower($headname); 
  316. return isset($this->m_httphead[$headname]) ? $this->m_httphead[$headname] : ''
  317. /** 
  318. * 设置Http头的值 
  319. * 
  320. * @access public 
  321. * @param string $skey 键 
  322. * @param string $svalue 值 
  323. * @return string 
  324. */ 
  325. function SetHead($skey,$svalue
  326. $this->m_puthead[$skey] = $svalue
  327. /** 
  328. * 打开连接 
  329. * 
  330. * @access public 
  331. * @return bool 
  332. */ 
  333. function PrivateOpenHost() 
  334. if($this->m_host==""
  335. return FALSE; 
  336. $errno = ""
  337. $errstr = ""
  338. $this->m_fp = @fsockopen($this->m_host, $this->m_port, $errno$errstr,10); 
  339. if(!$this->m_fp) 
  340. $this->m_error = $errstr
  341. return FALSE; 
  342. else 
  343. return TRUE; 
  344. /** 
  345. * 关闭连接 
  346. * 
  347. * @access public 
  348. * @return void 
  349. */ 
  350. function Close() 
  351. @fclose($this->m_fp); 
  352. /** 
  353. * 补全相对网址 
  354. * 
  355. * @access public 
  356. * @param string $surl 需要不全的地址 
  357. * @return string 
  358. */ 
  359. function FillUrl($surl
  360. $i = 0; 
  361. $dstr = ""
  362. $pstr = ""
  363. $okurl = ""
  364. $pathStep = 0; 
  365. $surl = trim($surl); 
  366. if($surl==""
  367. return ""
  368. $pos = strpos($surl,"#"); 
  369. if($pos>0) 
  370. $surl = substr($surl,0,$pos); 
  371. if($surl[0]=="/"
  372. $okurl = "http://".$this->HomeUrl.$surl
  373. else if($surl[0]=="."
  374. if(strlen($surl)<=1) 
  375. return ""
  376. else if($surl[1]=="/"
  377. $okurl = "http://".$this->BaseUrlPath."/".substr($surl,2,strlen($surl)-2); 
  378. else 
  379. $urls = explode("/",$surl); 
  380. foreach($urls as $u
  381. if($u==".."
  382. $pathStep++; 
  383. else if($i<count($urls)-1) 
  384. $dstr .= $urls[$i]."/"
  385. else 
  386. $dstr .= $urls[$i]; 
  387. $i++; 
  388. $urls = explode("/",$this->BaseUrlPath); 
  389. if(count($urls) <= $pathStep
  390. return ""
  391. else 
  392. $pstr = "http://"
  393. for($i=0;$i<count($urls)-$pathStep;$i++) 
  394. $pstr .= $urls[$i]."/"
  395. $okurl = $pstr.$dstr
  396. else 
  397. if(strlen($surl)<7) 
  398. $okurl = "http://".$this->BaseUrlPath."/".$surl
  399. else if(strtolower(substr($surl,0,7))=="http://"
  400. $okurl = $surl
  401. else 
  402. $okurl = "http://".$this->BaseUrlPath."/".$surl
  403. $okurl = preg_replace("/^(http:////)/i","",$okurl); 
  404. $okurl = preg_replace("///{1,}/""/"$okurl); 
  405. return "http://".$okurl
  406. }//End Class 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表