本文介绍下,在php中,实现下载文件的一些方法与代码,包括系统函数调用、wget、以及socket连接方式下载文件等。有需要的朋友作个参考吧。在php中实现下载文件,方法大多是如下二种:一种是使用system、exec等即有的函数调用系统自带的下载工具,比如 wget 之类的来下载文件。另一种是使用php本身利用socket来下载文件。
笔者喜欢用第二种方式。
使用socket下载文件,如果是http协议的文件,必须明白http协议的运行过程,如果是ftp协议的则要了解ftp协议运行过程。比如http协议访问一个文件:
使用fopen直接访问远程文件来达到目的,同时又可以访问http,也能访问ftp。当然,如果按照上面的思路来说,也可以使用ftp的函数库来实现。
使用fopen函数的例子:
#! /usr/bin/phpm_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();}////获得某操作错误的原因//function printerror(){ echo 错误信息:.$this->m_error; echo 具体返回头:
; foreach($this->m_httphead as $k=>$v) { echo $k => $v
\r\n; }}////判别用get方法发送的头的应答结果是否正确//function isgetok(){ if( ereg(^2,$this->gethead(http-state)) ) { return true; } else { $this->m_error .= $this->gethead(http-state). - .$this->gethead(http-describe).
; return false; }}////看看返回的网页是否是text类型//function istext(){ if(ereg(^2,$this->gethead(http-state)) && eregi(^text,$this->gethead(content-type))) { return true; } else { $this->m_error .= 内容为非文本类型
; return false; }}////判断返回的网页是否是特定的类型//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).
; return false; }}////用http协议下载文件//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文件//function savetotext($savefilename){ if($this->istext()) $this->savebinfile($savefilename); else return ;}////用http协议获得一个网页的内容//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会话//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;$im_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头的值//function gethead($headname){ $headname = strtolower($headname); if(isset($this->m_httphead[$headname])) return $this->m_httphead[$headname]; else return ;}////打开连接//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; }}////关闭连接//function close(){ @fclose($this->m_fp);}}?>
调用示例:1,下载网页
openurl(http://bbs.it-home.org);echo $httpdown->gethtml();$httpdown->close();?>
2,下载图片并保存
openurl(http://img.jbxue.com/images/1.jpg);echo $httpdown->savebin(test.jpg);$httpdown->close();echo ;?>