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(); # 釋放資源
?>
From:http://tw.wingwit.com/Article/program/PHP/201311/21071.html