PHP 支持断点续传人远程文件类的用法
内容摘要
这篇文章主要为大家详细介绍了PHP 支持断点续传人远程文件类的用法,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记。经测试代码如下:
/**
对此感兴趣的朋友,看看idc笔记做的技术笔记。经测试代码如下:
/**
文章正文
这篇文章主要为大家详细介绍了PHP 支持断点续传人远程文件类的用法,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记。经测试代码如下:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | <code class = "php" > /** * 支持断点续传人远程文件类 * * @param * @author php教程 www.idcnote.com **/ 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>\r\n" ; } } /** * 判别用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. " $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头的值 */ 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.idcnote.com" ); echo $httpdown ->GetHtml(); $httpdown ->Close(); #下载文件 $file = new HttpDownload(); # 实例化类 $file ->OpenUrl( "http://www.danbaise.com/cn/lit/an/rust020/rust020.pdf" ); # 远程文件地址 $file ->SaveToBin( "rust020.pdf" ); # 保存路径及文件名 $file ->Close(); # 释放资源 /*** 代码来自php教程(www.idcnote.com) ***/ </code> |
注:关于PHP 支持断点续传人远程文件类的用法的内容就先介绍到这里,更多相关文章的可以留意
代码注释