php远程下载类分享
本文实例为大家分享了php远程下载类,如下
<?php /** *下载远程文件类支持断点续传 */ classHttpDownload{ 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=""; /** *初始化 */ publicfunctionPrivateInit($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; } } } /** *打开指定网址 */ functionOpenUrl($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(); } /** *获得某操作错误的原因 */ publicfunctionprintError(){ echo"错误信息:".$this->m_error; echo"具体返回头:<br>"; foreach($this->m_httpheadas$k=>$v){ echo"$k=>$v<br>\r\n"; } } /** *判别用Get方法发送的头的应答结果是否正确 */ publicfunctionIsGetOK(){ if(ereg("^2",$this->GetHead("http-state"))){ returntrue; }else{ $this->m_error.=$this->GetHead("http-state")."-".$this->GetHead("http-describe")."<br>"; returnfalse; } } /** *看看返回的网页是否是text类型 */ publicfunctionIsText(){ if(ereg("^2",$this->GetHead("http-state"))&&eregi("^text",$this->GetHead("content-type"))){ returntrue; }else{ $this->m_error.="内容为非文本类型<br>"; returnfalse; } } /** *判断返回的网页是否是特定的类型 */ publicfunctionIsContentType($ctype){ if(ereg("^2",$this->GetHead("http-state"))&&$this->GetHead("content-type")==strtolower($ctype)){ returntrue; }else{ $this->m_error.="类型不对".$this->GetHead("content-type")."<br>"; returnfalse; } } /** *用HTTP协议下载文件 */ publicfunctionSaveToBin($savefilename){ if(!$this->IsGetOK())returnfalse; if(@feof($this->m_fp)){ $this->m_error="连接已经关闭!"; returnfalse; } $fp=fopen($savefilename,"w")ordie("写入文件$savefilename失败!"); while(!feof($this->m_fp)){ @fwrite($fp,fgets($this->m_fp,256)); } @fclose($this->m_fp); returntrue; } /** *保存网页内容为Text文件 */ publicfunctionSaveToText($savefilename){ if($this->IsText()){ $this->SaveBinFile($savefilename); }else{ return""; } } /** *用HTTP协议获得一个网页的内容 */ publicfunctionGetHtml(){ 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会话 */ publicfunctionPrivateStartSession(){ if(!$this->PrivateOpenHost()){ $this->m_error.="打开远程主机出错!"; returnfalse; } 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."$httpv\r\n"); fputs($this->m_fp,"Host:".$this->m_host."\r\n"); fputs($this->m_fp,"Accept:*/*\r\n"); fputs($this->m_fp,"User-Agent:Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2)\r\n"); #HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束 if($httpv=="HTTP/1.1"){ fputs($this->m_fp,"Connection:Close\r\n\r\n"); }else{ fputs($this->m_fp,"\r\n"); } $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头的值 */ publicfunctionGetHead($headname){ $headname=strtolower($headname); if(isset($this->m_httphead[$headname])){ return$this->m_httphead[$headname]; }else{ return""; } } /** *打开连接 */ publicfunctionPrivateOpenHost(){ if($this->m_host=="")returnfalse; $this->m_fp=@fsockopen($this->m_host,$this->m_port,&$errno,&$errstr,10); if(!$this->m_fp){ $this->m_error=$errstr; returnfalse; }else{ returntrue; } } /** *关闭连接 */ publicfunctionClose(){ @fclose($this->m_fp); } } #两种使用方法,分别如下: #打开网页 $httpdown=newHttpDownload(); $httpdown->OpenUrl("http://www.google.com.hk"); echo$httpdown->GetHtml(); $httpdown->Close(); #下载文件 $file=newHttpDownload();#实例化类 $file->OpenUrl("http://dldir1.qq.com/qqfile/qq/QQ8.2/17724/QQ8.2.exe");#远程文件地址 $file->SaveToBin("qq.exe");#保存路径及文件名 $file->Close();#释放资源
以上就是本文的全部内容,希望对大家的学习有所帮助。