程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 下載遠程文件類(支持斷點續傳)

PHP 下載遠程文件類(支持斷點續傳)

編輯:關於PHP編程

    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(); # 釋放資源
    ?>
     
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved