php

位置:IT落伍者 >> php >> 浏览文章

PHP 下载远程文件类(支持断点续传)


发布日期:2021年12月04日
 
PHP 下载远程文件类(支持断点续传)

PHP 下载远程文件类支持断点续传下载代码内含有具体的调用说明程序主要是使用 HTTP 协议下载文件HTTP协议必须指定文档结束后关闭链接否则读取文档时无法使用feof判断结束可以有两种使用方法具体请下载查看源码

<?php/** * 下载远程文件类支持断点续传  */class HttpDownload {private $m_url = ""; private $m_urlpath = ""; private $m_scheme = "http"; private $m_host = ""; private $m_port = ""; 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 = "";$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("^"$this>GetHead("httpstate")) ) { return true; } else {$this>m_error = $this>GetHead("httpstate")" "$this>GetHead("httpdescribe")"<br>";return false;}}/*** 看看返回的网页是否是text类型*/public function IsText() {if (ereg("^"$this>GetHead("httpstate")) && eregi("^text"$this>GetHead("contenttype"))) { return true; } else {$this>m_error = "内容为非文本类型<br>";return false;}}/*** 判断返回的网页是否是特定的类型*/public function IsContentType($ctype) {if (ereg("^"$this>GetHead("httpstate")) && $this>GetHead("contenttype") == strtolower($ctype)) { return true; } else {$this>m_error = "类型不对 "$this>GetHead("contenttype")"<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($fpfgets($this>m_fp));}@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);}@fclose($this>m_fp);return $this>m_html;}/*** 开始 HTTP 会话*/public function PrivateStartSession() {if (!$this>PrivateOpenHost()) {$this>m_error = "打开远程主机出错!";return false;}if ($this>GetHead("httpedition")=="HTTP/") {$httpv = "HTTP/";} else {$httpv = "HTTP/";}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"UserAgent: Mozilla/+(compatible;+MSIE+;+Windows+NT+)rn");#HTTP协议必须指定文档结束后关闭链接否则读取文档时无法使用feof判断结束if ($httpv=="HTTP/") {fputs($this>m_fp"Connection: Closernrn");} else {fputs($this>m_fp"rn");}$httpstas = fgets($this>m_fp);$httpstas = split(" "$httpstas);$this>m_httphead["httpedition"] = trim($httpstas[]);$this>m_httphead["httpstate"] = trim($httpstas[]);$this>m_httphead["httpdescribe"] = "";for ($i=;$i<count($httpstas);$i++) {$this>m_httphead["httpdescribe"] = " "trim($httpstas[$i]);}while (!feof($this>m_fp)) {$line = str_replace("""""trim(fgets($this>m_fp)));if($line == "") break;if (ereg(":"$line)) {$lines = split(":"$line);$this>m_httphead[strtolower(trim($lines[]))] = trim($lines[]);}}}/*** 获得一个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);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("echo $httpdown>GetHtml();$httpdown>Close();#下载文件$file = new HttpDownload(); # 实例化类$file>OpenUrl("# 远程文件地址$file>SaveToBin("rustpdf"); # 保存路径及文件名$file>Close(); # 释放资源?>

               

上一篇:PHP 过滤页面中的BOM(实现代码)

下一篇:PHP负载均衡指南