>백엔드 개발 >PHP 튜토리얼 >중단점 이력서 다운로드를 지원하는 PHP 다운로드 원격 파일 클래스

중단점 이력서 다운로드를 지원하는 PHP 다운로드 원격 파일 클래스

WBOY
WBOY원래의
2016-07-25 08:44:21869검색
斷點續傳, PHP

PHP 다운로드 원격 파일 클래스, 중단점 재개 다운로드 지원, 코드에는 특정 호출 지침이 포함되어 있습니다. 프로그램은 주로 HTTP 프로토콜을 사용하여 파일을 다운로드합니다. HTTP1.1 프로토콜은 문서가 끝난 후 링크를 ​​닫아야 함을 지정해야 합니다. 그렇지 않으면 문서를 읽을 때 feof를 사용하여 끝을 판단할 수 없습니다. 자세한 내용은 소스 코드를 다운로드하여 확인하세요.

  1. /**
  2. * 원격 파일 다운로드는 중단점 재개를 지원합니다
  3. */
  4. class HttpDownload {
  5. private $m_url = "";
  6. private $m_urlpath = "";
  7. 개인 $m_scheme = "http";
  8. 개인 $m_host = "";
  9. 개인 $m_port = "80";
  10. 개인 $m_user = "";
  11. 개인 $ m_pass = "";
  12. 비공개 $m_path = "/";
  13. 비공개 $m_query = "";
  14. 비공개 $m_fp = "";
  15. 비공개 $m_error = "";
  16. 비공개 $m_httphead = "" ;
  17. 비공개 $m_html = "";
  18. /**
  19. * 초기화
  20. */
  21. 공개 함수 PrivateInit($url){
  22. $urls = "";
  23. $urls = @parse_url($url);
  24. $this->m_url = $url;
  25. if(is_array($urls)) {
  26. $this->m_host = $urls ["호스트"];
  27. if(!empty($urls["scheme"])) $this->m_scheme = $urls["scheme"];
  28. if(!empty($urls[" user"])) $this->m_user = $urls["user"];
  29. if(!empty($urls["pass"])) $this->m_pass = $urls["pass" ];
  30. if(!empty($urls["port"])) $this->m_port = $urls["port"];
  31. if(!empty($urls["path"]) ) $this->m_path = $urls["path"];
  32. $this->m_urlpath = $this->m_path;
  33. if(!empty($urls["query"])) {
  34. $this->m_query = $urls["query"];
  35. $this->m_urlpath .= "?".$this->m_query;
  36. }
  37. }
  38. }
  39. /**
  40. * 지정된 URL을 엽니다
  41. */
  42. function OpenUrl($url) {
  43. # 重设各参数
  44. $this->m_url = "";
  45. $this->m_urlpath = "";
  46. $this->m_scheme = "http";
  47. $this->m_host = "";
  48. $this->m_port = "80 ";
  49. $this->m_user = "";
  50. $this->m_pass = "";
  51. $this->m_path = "/";
  52. $this-> m_query = "";
  53. $this->m_error = "";
  54. $this->m_httphead = "" ;
  55. $this->m_html = "";
  56. $this- >Close();
  57. #初始化系统
  58. $this->PrivateInit($url);
  59. $this->PrivateStartSession();
  60. }
  61. /* *
  62. * 연산 오류의 원인 파악
  63. */
  64. 공용 함수 printError() {
  65. echo "错误信息:".$this->m_error;
  66. echo "具体返回头:
    ";
  67. foreach($this->m_httphead as $k=>$v) {
  68. echo "$k => $v
    rn";
  69. }
  70. }
  71. /**
  72. * Get 메소드를 사용하여 보낸 헤더의 응답 결과가 올바른지 확인
  73. */
  74. 공개 함수 IsGetOK() {
  75. if( ereg("^2 ",$this->GetHead("http-state")) ) {
  76. return true;
  77. } else {
  78. $this->m_error .= $this->GetHead("http -상태")." - ".$this->GetHead("http-describe")."
    ";
  79. return false;
  80. }
  81. }
  82. /**
  83. * 반환된 웹페이지가 텍스트 유형인지 확인
  84. */
  85. 공용 함수 IsText() {
  86. if (ereg("^2",$this->GetHead("http-state")) && eregi("^text",$this-> GetHead("content-type"))) {
  87. return true;
  88. } else {
  89. $this->m_error .= "内容为無文本类型
    ";
  90. return false;
  91. }
  92. }
  93. /**
  94. * 반환된 웹페이지가 특정 유형인지 확인
  95. */
  96. 공개 함수 IsContentType($ctype) {
  97. if (ereg("^2",$this->GetHead ("http-state")) && $this->GetHead("content-type") == strtolower($ctype)) {
  98. return true
  99. } else {
  100. $this-> ;m_error .= "类型不对 ".$this->GetHead("content-type")."
    ";
  101. return false;
  102. }
  103. }
  104. /**
  105. * HTTP 프로토콜을 사용하여 파일 다운로드
  106. */
  107. 공용 함수 SaveToBin($savefilename) {
  108. if (!$this->IsGetOK()) return false;
  109. if (@feof($this-> m_fp)) {
  110. $this->m_error = "连接已经关闭!"
  111. return false;
  112. }
  113. $fp = fopen($savefilename,"w") 또는 die("写入文件 $savefilename 失败!");
  114. while (!feof($this->m_fp)) {
  115. @fwrite($fp,fgets($this->m_fp,256));
  116. }
  117. @ fclose( $this->m_fp);
  118. return true;
  119. }
  120. /**
  121. * 儲存網頁內容為 Text 檔案
  122. */
  123. public function SaveToText($savefilename) {
  124. if ( $this- >IsText()) {
  125. $this->SaveBinFile($savefilename);
  126. } else {
  127. return "";
  128. }
  129. }
  130. /**
  131. * 用 HTTP 協定取得一個網頁的內容
  132. */
  133. public function GetHtml() {
  134. if (!$this->IsText()) return "";
  135. if ($this->m_html!= "") return $this- >m_html;
  136. if (!$this->m_fp||@feof($this->m_fp)) return "";
  137. while(!feof($this ->m_fp)) {
  138. $ this->m_html .= fgets($this->m_fp,256);
  139. }
  140. @fclose($this->m_fp);
  141. return $this->m_html;
  142. }
  143. }
  144. /**
  145. * 開始 HTTP 會話
  146. */
  147. public function PrivateStartSession() {
  148. if (!$this->PrivateOpenHost() ) {
  149. $this->m_error .= "開啟遠端主機錯誤! ";
  150. } else {
  151. $httpv = "HTTP/1.0";
  152. }
  153. fputs($this->m_fp,"GET ".$this->m_urlpath."$httpvrn") ;
  154. fputs($this->m_fp,"主機:".$this->m_host."rn");
  155. fputs($this->m_fp,"接受:*/*rn");
  156. fputs($this->m_fp,"用戶代理:Mozilla/4.0(相容;MSIE 6.0;Windows NT 5.2)rn");
  157. #HTTP1.1協定必須指定文件結束後關閉鏈接,否則讀取文件時無法使用feof判斷結束
  158. if ($httpv=="HTTP/1.1") {
  159. fputs($this->m_fp,"連接: Closernrn");
  160. } else {
  161. fputs($this->m_fp,"rn");
  162. }
  163. $ httpsstas = fgets($this->m_fp,256);
  164. $httpsstas = split(" ",$httpsstas);
  165. $this->m_httphead["http-edition"] = trim($httpsstas [0]);
  166. $this->m_httphead["http-state"] = trim($httpsstas[1]);
  167. $this->m_httphead["http-describe"] = "" ;
  168. for ($i=2;$i $this->m_httphead[ "http-describe"] .= " ".trim($httpsstas[ $i]);
  169. }
  170. while (!feof($this->m_fp)) {
  171. $line = str_replace(" "","",trim(fgets($this->m_fp) m_fp,256)));
  172. if($line == "") break;
  173. if (ereg(":",$line )) {
  174. $lines = split(":",$ line);
  175. $this->m_httphead[strtolower(trim($lines[0]))] = trim($lines[1]);
  176. }
  177. }
  178. }
  179. /**
  180. * 得到一個Http頭的值
  181. */
  182. public function GetHead($headname) {
  183. $headname = strtolower($headname);
  184. if (isset($this->m_httphead[$headname) ])) {
  185. return $this->m_httphead[$headname];
  186. } else {
  187. return "";
  188. }
  189. }
  190. /**
  191. * 開啟連線
  192. */
  193. public function PrivateOpenHost() {
  194. if ($this->m_host=="") return false;
  195. $this ->m_fp = @fsockopen($this->m_fp; m_host, $this->m_port, &$errno, &$errstr,10);
  196. if (!$this->m_fp){
  197. $this->m_error = $errstr;
  198. return false;
  199. } else {
  200. return true;
  201. }
  202. }
  203. /**
  204. * 關閉連線
  205. */
  206. public function Close(){
  207. @ fclose($ this->m_fp);
  208. }
  209. }
  210. # 兩種使用方法,分別如下:
  211. #開啟網頁
  212. $httpdown = new HttpDownload ();
  213. $httpdown->OpenUrl("http://www.google.com.hk");
  214. echo $httpdown->GetHtml();
  215. $httpdown->關閉();
  216. #下載檔案
  217. $file = new HttpDownload(); # 實例化類別
  218. $file->OpenUrl("http://www.ti.com.cn/cn/lit/an/rust020/rust020.pdf"); # 遠端檔案位址
  219. $file->SaveToBin("rust020.pdf"); # 儲存路徑及檔名
  220. $file->Close(); # 釋放資源
  221. ?>
  222. 複製程式碼

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP는 GUID를 생성다음 기사:PHP는 GUID를 생성