PHP 下載遠程檔案類,支援斷點續傳下載,代碼內含有具體的調用說明。程式主要是使用 HTTP 協議下載檔案,HTTP1.1協議必須指定文檔結束後關閉連結,否則讀取文檔時無法使用feof判斷結束,可以有兩種使用方法,具體請下載查看源碼。
<?php/** * 下載遠程檔案類支援斷點續傳 */class HttpDownload {private $m_url = ""; private $m_urlpath = ""; private $m_scheme = "http"; private $m_host = ""; private $m_port = "80"; private $m_user = ""; private $m_pass = ""; private $m_path = "/"; private $m_query = ""; private $m_fp = ""; private $m_error = "";private $m_httphead = "" ;private $m_html = ""; /** * 初始化 */public function PrivateInit($url){$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; } }} /*** 開啟指定網址*/function OpenUrl($url) {#重設各參數$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 = "";$this->m_httphead = "" ;$this->m_html = "";$this->Close();#初始化系統$this->PrivateInit($url);$this->PrivateStartSession();}/*** 獲得某操作錯誤的原因*/public function printError() {echo "錯誤資訊:".$this->m_error;echo "具體返回頭:<br>";foreach($this->m_httphead as $k=>$v) { echo "$k => $v <br>rn"; }} /*** 判別用Get方法發送的頭的應答結果是否正確*/public function IsGetOK() {if( ereg("^2",$this->GetHead("http-state")) ) { return true; } else {$this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br>";return false;}}/*** 看看返回的網頁是否是text類型*/public function IsText() {if (ereg("^2",$this->GetHead("http-state")) && eregi("^text",$this->GetHead("content-type"))) { return true; } else {$this->m_error .= "內容為非文本類型<br>";return false;}}/*** 判斷返回的網頁是否是特定的類型*/public function IsContentType($ctype) {if (ereg("^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 協議下載檔案*/public function SaveToBin($savefilename) {if (!$this->IsGetOK()) return false;if (@feof($this->m_fp)) { $this->m_error = "串連已經關閉!"; return false; }$fp = fopen($savefilename,"w") or die("寫入檔案 $savefilename 失敗!");while (!feof($this->m_fp)) {@fwrite($fp,fgets($this->m_fp,256));}@fclose($this->m_fp);return true;}/*** 儲存網頁內容為 Text 檔案*/public function SaveToText($savefilename) {if ($this->IsText()) {$this->SaveBinFile($savefilename);} else {return "";}}/*** 用 HTTP 協議獲得一個網頁的內容*/public 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 會話*/public function PrivateStartSession() {if (!$this->PrivateOpenHost()) {$this->m_error .= "開啟遠程主機出錯!";return false;}if ($this->GetHead("http-edition")=="HTTP/1.1") {$httpv = "HTTP/1.1";} else {$httpv = "HTTP/1.0";}fputs($this->m_fp,"GET ".$this->m_urlpath." $httpvrn");fputs($this->m_fp,"Host: ".$this->m_host."rn");fputs($this->m_fp,"Accept: */*rn");fputs($this->m_fp,"User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2)rn");#HTTP1.1協議必須指定文檔結束後關閉連結,否則讀取文檔時無法使用feof判斷結束if ($httpv=="HTTP/1.1") {fputs($this->m_fp,"Connection: Closernrn");} else {fputs($this->m_fp,"rn");}$httpstas = fgets($this->m_fp,256);$httpstas = split(" ",$httpstas);$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 = str_replace(""","",trim(fgets($this->m_fp,256)));if($line == "") break;if (ereg(":",$line)) {$lines = split(":",$line);$this->m_httphead[strtolower(trim($lines[0]))] = trim($lines[1]);}}}/*** 獲得一個Http頭的值*/public function GetHead($headname) {$headname = strtolower($headname);if (isset($this->m_httphead[$headname])) {return $this->m_httphead[$headname];} else {return "";}}/*** 開啟串連*/public function PrivateOpenHost() {if ($this->m_host=="") return false;$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;}}/*** 關閉串連*/public function Close(){@fclose($this->m_fp);}}#兩種使用方法,分別如下:#開啟網頁$httpdown = new HttpDownload();$httpdown->OpenUrl("http://www.google.com.hk");echo $httpdown->GetHtml();$httpdown->Close();#下載檔案$file = new HttpDownload(); # 執行個體化類$file->OpenUrl("http://www.ti.com.cn/cn/lit/an/rust020/rust020.pdf"); # 遠程檔案地址$file->SaveToBin("rust020.pdf"); # 儲存路徑及檔案名稱$file->Close(); # 釋放資源?>