PHP 다운로드 원격 파일 클래스, 중단점 재개 다운로드 지원, 코드에는 특정 호출 지침이 포함되어 있습니다. 프로그램은 주로 HTTP 프로토콜을 사용하여 파일을 다운로드합니다. HTTP1.1 프로토콜은 문서가 끝난 후 링크를 닫아야 함을 지정해야 합니다. 그렇지 않으면 문서를 읽을 때 feof를 사용하여 끝을 판단할 수 없습니다. 자세한 내용은 소스 코드를 다운로드하여 확인하세요.
- /**
- * 원격 파일 다운로드는 중단점 재개를 지원합니다
- */
- class HttpDownload {
- private $m_url = "";
- private $m_urlpath = "";
- 개인 $m_scheme = "http";
- 개인 $m_host = "";
- 개인 $m_port = "80";
- 개인 $m_user = "";
- 개인 $ m_pass = "";
- 비공개 $m_path = "/";
- 비공개 $m_query = "";
- 비공개 $m_fp = "";
- 비공개 $m_error = "";
- 비공개 $m_httphead = "" ;
- 비공개 $m_html = "";
- /**
- * 초기화
- */
- 공개 함수 PrivateInit($url){
- $urls = "";
- $urls = @parse_url($url);
- $this->m_url = $url;
- if(is_array($urls)) {
- $this->m_host = $urls ["호스트"];
- 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;
- }
- }
- }
-
- /**
- * 지정된 URL을 엽니다
- */
- 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();
- }
-
- /* *
- * 연산 오류의 원인 파악
- */
- 공용 함수 printError() {
- echo "错误信息:".$this->m_error;
- echo "具体返回头:
";
- foreach($this->m_httphead as $k=>$v) {
- echo "$k => $v
rn";
- }
- }
-
- /**
- * Get 메소드를 사용하여 보낸 헤더의 응답 결과가 올바른지 확인
- */
- 공개 함수 IsGetOK() {
- if( ereg("^2 ",$this->GetHead("http-state")) ) {
- return true;
- } else {
- $this->m_error .= $this->GetHead("http -상태")." - ".$this->GetHead("http-describe")."
";
- return false;
- }
- }
-
- /**
- * 반환된 웹페이지가 텍스트 유형인지 확인
- */
- 공용 함수 IsText() {
- if (ereg("^2",$this->GetHead("http-state")) && eregi("^text",$this-> GetHead("content-type"))) {
- return true;
- } else {
- $this->m_error .= "内容为無文本类型
";
- return false;
- }
- }
- /**
- * 반환된 웹페이지가 특정 유형인지 확인
- */
- 공개 함수 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")."
";
- return false;
- }
- }
-
- /**
- * HTTP 프로토콜을 사용하여 파일 다운로드
- */
- 공용 함수 SaveToBin($savefilename) {
- if (!$this->IsGetOK()) return false;
- if (@feof($this-> m_fp)) {
- $this->m_error = "连接已经关闭!"
- return false;
- }
- $fp = fopen($savefilename,"w") 또는 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 .= "開啟遠端主機錯誤! ";
- } else {
- $httpv = "HTTP/1.0";
- }
- fputs($this->m_fp,"GET ".$this->m_urlpath."$httpvrn") ;
- fputs($this->m_fp,"主機:".$this->m_host."rn");
- fputs($this->m_fp,"接受:*/*rn");
- fputs($this->m_fp,"用戶代理:Mozilla/4.0(相容;MSIE 6.0;Windows NT 5.2)rn");
- #HTTP1.1協定必須指定文件結束後關閉鏈接,否則讀取文件時無法使用feof判斷結束
- if ($httpv=="HTTP/1.1") {
- fputs($this->m_fp,"連接: Closernrn");
- } else {
- fputs($this->m_fp,"rn");
- }
- $ httpsstas = fgets($this->m_fp,256);
- $httpsstas = split(" ",$httpsstas);
- $this->m_httphead["http-edition"] = trim($httpsstas [0]);
- $this->m_httphead["http-state"] = trim($httpsstas[1]);
- $this->m_httphead["http-describe"] = "" ;
- for ($i=2;$i $this->m_httphead[ "http-describe"] .= " ".trim($httpsstas[ $i]);
- }
- while (!feof($this->m_fp)) {
- $line = str_replace(" "","",trim(fgets($this->m_fp) 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_fp; 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->關閉();
-
- #下載檔案
- $file = new HttpDownload(); # 實例化類別
- $file->OpenUrl("http://www.ti.com.cn/cn/lit/an/rust020/rust020.pdf"); # 遠端檔案位址
- $file->SaveToBin("rust020.pdf"); # 儲存路徑及檔名
- $file->Close(); # 釋放資源
- ?>
-
-
- 複製程式碼
|
斷點續傳, PHP