首页 > 语言 > PHP > 正文

php远程下载类分享

2024-09-04 11:46:53
字体:
来源:转载
供稿:网友

本文实例为大家分享了php远程下载类,如下:

  1. <?php  
  2.  
  3. /**  
  4.  
  5. * 下载远程文件类支持断点续传  
  6.  
  7. */ 
  8.  
  9. class HttpDownload {  
  10.  
  11. private $m_url = "";  
  12.  
  13. private $m_urlpath = "";  
  14.  
  15. private $m_scheme = "http";  
  16.  
  17. private $m_host = "";  
  18.  
  19. private $m_port = "80";  
  20.  
  21. private $m_user = "";  
  22.  
  23. private $m_pass = "";  
  24.  
  25. private $m_path = "/";  
  26.  
  27. private $m_query = "";  
  28.  
  29. private $m_fp = "";  
  30.  
  31. private $m_error = "";  
  32.  
  33. private $m_httphead = "" ;  
  34.  
  35. private $m_html = "";  
  36.  
  37.    
  38.  
  39. /**  
  40.  
  41. * 初始化  
  42.  
  43. */ 
  44.  
  45. public function PrivateInit($url){  
  46.  
  47. $urls = "";  
  48.  
  49. $urls = @parse_url($url);  
  50.  
  51. $this->m_url = $url;  
  52.  
  53. if(is_array($urls)) {  
  54.  
  55. $this->m_host = $urls["host"];  
  56.  
  57. if(!emptyempty($urls["scheme"])) $this->m_scheme = $urls["scheme"];  
  58.  
  59. if(!emptyempty($urls["user"])) $this->m_user = $urls["user"];  
  60.  
  61. if(!emptyempty($urls["pass"])) $this->m_pass = $urls["pass"];  
  62.  
  63. if(!emptyempty($urls["port"])) $this->m_port = $urls["port"];  
  64.  
  65. if(!emptyempty($urls["path"])) $this->m_path = $urls["path"];  
  66.  
  67. $this->m_urlpath = $this->m_path;  
  68.  
  69. if(!emptyempty($urls["query"])) {  
  70.  
  71. $this->m_query = $urls["query"];  
  72.  
  73. $this->m_urlpath .= "?".$this->m_query;  
  74.  
  75. }  
  76.  
  77. }  
  78.  
  79. }  
  80.  
  81.    
  82.  
  83. /**  
  84.  
  85. * 打开指定网址  
  86.  
  87. */ 
  88.  
  89. function OpenUrl($url) {  
  90.  
  91. #重设各参数  
  92.  
  93. $this->m_url = "";  
  94.  
  95. $this->m_urlpath = "";  
  96.  
  97. $this->m_scheme = "http";  
  98.  
  99. $this->m_host = "";  
  100.  
  101. $this->m_port = "80";  
  102.  
  103. $this->m_user = "";  
  104.  
  105. $this->m_pass = "";  
  106.  
  107. $this->m_path = "/";  
  108.  
  109. $this->m_query = "";  
  110.  
  111. $this->m_error = "";  
  112.  
  113. $this->m_httphead = "" ;  
  114.  
  115. $this->m_html = "";  
  116.  
  117. $this->Close();  
  118.  
  119. #初始化系统  
  120.  
  121. $this->PrivateInit($url);  
  122.  
  123. $this->PrivateStartSession();  
  124.  
  125. }  
  126.  
  127.    
  128.  
  129. /**  
  130.  
  131. * 获得某操作错误的原因  
  132.  
  133. */ 
  134.  
  135. public function printError() {  
  136.  
  137. echo "错误信息:".$this->m_error;  
  138.  
  139. echo "具体返回头:<br>";  
  140.  
  141. foreach($this->m_httphead as $k=>$v) {  
  142.  
  143. echo "$k => $v <br>/r/n";  
  144.  
  145. }  
  146.  
  147. }  
  148.  
  149.    
  150.  
  151. /**  
  152.  
  153. * 判别用Get方法发送的头的应答结果是否正确  
  154.  
  155. */ 
  156.  
  157. public function IsGetOK() {  
  158.  
  159. ifereg("^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.  
  167. return false;  
  168.  
  169. }  
  170.  
  171. }  
  172.  
  173.    
  174.  
  175. /**  
  176.  
  177. * 看看返回的网页是否是text类型  
  178.  
  179. */ 
  180.  
  181. public function IsText() {  
  182.  
  183. if (ereg("^2",$this->GetHead("http-state")) && eregi("^text",$this->GetHead("content-type"))) {  
  184.  
  185. return true;  
  186.  
  187. else {  
  188.  
  189. $this->m_error .= "内容为非文本类型<br>";  
  190.  
  191. return false;  
  192.  
  193. }  
  194.  
  195. }  
  196.  
  197. /**  
  198.  
  199. * 判断返回的网页是否是特定的类型  
  200.  
  201. */ 
  202.  
  203. public function IsContentType($ctype) {  
  204.  
  205. if (ereg("^2",$this->GetHead("http-state")) && $this->GetHead("content-type") == strtolower($ctype)) {  
  206.  
  207. return true;  
  208.  
  209. else {  
  210.  
  211. $this->m_error .= "类型不对 ".$this->GetHead("content-type")."<br>";  
  212.  
  213. return false;  
  214.  
  215. }  
  216.  
  217. }  
  218.  
  219.    
  220.  
  221. /**  
  222.  
  223. * 用 HTTP 协议下载文件  
  224.  
  225. */ 
  226.  
  227. public function SaveToBin($savefilename) {  
  228.  
  229. if (!$this->IsGetOK()) return false;  
  230.  
  231. if (@feof($this->m_fp)) {  
  232.  
  233. $this->m_error = "连接已经关闭!";  
  234.  
  235. return false;  
  236.  
  237. }  
  238.  
  239. $fp = fopen($savefilename,"w"or die("写入文件 $savefilename 失败!");  
  240.  
  241. while (!feof($this->m_fp)) {  
  242.  
  243. @fwrite($fp,fgets($this->m_fp,256));  
  244.  
  245. }  
  246.  
  247. @fclose($this->m_fp);  
  248.  
  249. return true;  
  250.  
  251. }  
  252.  
  253.    
  254.  
  255. /**  
  256.  
  257. * 保存网页内容为 Text 文件  
  258.  
  259. */ 
  260.  
  261. public function SaveToText($savefilename) {  
  262.  
  263. if ($this->IsText()) {  
  264.  
  265. $this->SaveBinFile($savefilename);  
  266.  
  267. else {  
  268.  
  269. return "";  
  270.  
  271. }  
  272.  
  273. }  
  274.  
  275.    
  276.  
  277. /**  
  278.  
  279. * 用 HTTP 协议获得一个网页的内容  
  280.  
  281. */ 
  282.  
  283. public function GetHtml() {  
  284.  
  285. if (!$this->IsText()) return "";  
  286.  
  287. if ($this->m_html!=""return $this->m_html;  
  288.  
  289. if (!$this->m_fp||@feof($this->m_fp)) return "";  
  290.  
  291. while(!feof($this->m_fp)) {  
  292.  
  293. $this->m_html .= fgets($this->m_fp,256);  
  294.  
  295. }  
  296.  
  297. @fclose($this->m_fp);  
  298.  
  299. return $this->m_html;  
  300.  
  301. }  
  302.  
  303.    
  304.  
  305. /**  
  306.  
  307. * 开始 HTTP 会话  
  308.  
  309. */ 
  310.  
  311. public function PrivateStartSession() {  
  312.  
  313. if (!$this->PrivateOpenHost()) {  
  314.  
  315. $this->m_error .= "打开远程主机出错!";  
  316.  
  317. return false;  
  318.  
  319. }  
  320.  
  321. if ($this->GetHead("http-edition")=="HTTP/1.1") {  
  322.  
  323. $httpv = "HTTP/1.1";  
  324.  
  325. else {  
  326.  
  327. $httpv = "HTTP/1.0";  
  328.  
  329. }  
  330.  
  331. fputs($this->m_fp,"GET ".$this->m_urlpath." $httpv/r/n");  
  332.  
  333. fputs($this->m_fp,"Host: ".$this->m_host."/r/n");  
  334.  
  335. fputs($this->m_fp,"Accept: */*/r/n");  
  336.  
  337. fputs($this->m_fp,"User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2)/r/n");  
  338.  
  339. #HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束  
  340.  
  341. if ($httpv=="HTTP/1.1") {  
  342.  
  343. fputs($this->m_fp,"Connection: Close/r/n/r/n");  
  344.  
  345. else {  
  346.  
  347. fputs($this->m_fp,"/r/n");  
  348.  
  349. }  
  350.  
  351. $httpstas = fgets($this->m_fp,256);  
  352.  
  353. $httpstas = split(" ",$httpstas);  
  354.  
  355. $this->m_httphead["http-edition"] = trim($httpstas[0]);  
  356.  
  357. $this->m_httphead["http-state"] = trim($httpstas[1]);  
  358.  
  359. $this->m_httphead["http-describe"] = "";  
  360.  
  361. for ($i=2;$i<count($httpstas);$i++) {="" $this-="">m_httphead["http-describe"] .= " ".trim($httpstas[$i]);  
  362.  
  363. }  
  364.  
  365. while (!feof($this->m_fp)) {  
  366.  
  367. $line = str_replace("/"","",trim(fgets($this->m_fp,256)));  
  368.  
  369. if($line == ""break;  
  370.  
  371. if (ereg(":",$line)) {  
  372.  
  373. $lines = split(":",$line);  
  374.  
  375. $this->m_httphead[strtolower(trim($lines[0]))] = trim($lines[1]);  
  376.  
  377. }  
  378.  
  379. }  
  380.  
  381. }  
  382.  
  383.    
  384.  
  385. /**  
  386.  
  387. * 获得一个Http头的值  
  388.  
  389. */  
  390.  
  391. public function GetHead($headname) {  
  392.  
  393. $headname = strtolower($headname);  
  394.  
  395. if (isset($this->m_httphead[$headname])) {  
  396.  
  397. return $this->m_httphead[$headname];  
  398.  
  399. else {  
  400.  
  401. return "";  
  402.  
  403. }  
  404.  
  405. }  
  406.  
  407.    
  408.  
  409. /**  
  410.  
  411. * 打开连接  
  412.  
  413. */ 
  414.  
  415. public function PrivateOpenHost() {  
  416.  
  417. if ($this->m_host==""return false;  
  418.  
  419. $this->m_fp = @fsockopen($this->m_host, $this->m_port, &$errno, &$errstr,10);  
  420.  
  421. if (!$this->m_fp){  
  422.  
  423. $this->m_error = $errstr;  
  424.  
  425. return false;  
  426.  
  427. else {  
  428.  
  429. return true;  
  430.  
  431. }  
  432.  
  433. }  
  434.  
  435.    
  436.  
  437. /**  
  438.  
  439. * 关闭连接  
  440.  
  441. */ 
  442.  
  443. public function Close(){  
  444.  
  445. @fclose($this->m_fp);  
  446.  
  447. }  
  448.  
  449. }  
  450.  
  451.    
  452.  
  453. #两种使用方法,分别如下:  
  454.  
  455.    
  456.  
  457. #打开网页  
  458.  
  459. $httpdown = new HttpDownload();  
  460.  
  461. $httpdown->OpenUrl("http://www.google.com.hk");  
  462.  
  463. echo $httpdown->GetHtml();  
  464.  
  465. $httpdown->Close();  
  466.  
  467. //Vevb.com 
  468.  
  469. #下载文件  
  470.  
  471. $file = new HttpDownload(); # 实例化类  
  472.  
  473. $file->OpenUrl("http://dldir1.qq.com/qqfile/qq/QQ8.2/17724/QQ8.2.exe"); # 远程文件地址  
  474.  
  475. $file->SaveToBin("qq.exe"); # 保存路径及文件名  
  476.  
  477. $file->Close(); # 释放资源 
  478.  
  479. </count($httpstas);$i++)> 

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