深入PHP FTP类的详解
发布时间:2020-05-24 15:02:26 所属栏目:PHP 来源:互联网
导读:本篇文章是对PHP的FTP类进行了详细的分析介绍,需要的朋友参考下
|
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP 的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。 使用PHP操作FTP-用法 代码如下: // 联接FTP服务器 $conn = ftp_connect(ftp.server.com); // 使用username和password登录 ftp_login($conn,“john”,“doe”); // 获取远端系统类型 ftp_systype($conn); // 列示文件 $filelist = ftp_nlist($conn,“.”); // 下载文件 ftp_get($conn,“data.zip”,FTP_BINARY); // 关闭联接 ftp_quit($conn); //初结化一个FTP联接,PHP提供了ftp_connect()这个函数,它使用主机名称和端口作为参数。在上面的例子里,主机名字为 “ftp.server.com”;如果端口没指定,PHP将会使用“21”作为缺省端口来建立联接。 //联接成功后ftp_connect()传回一个handle句柄;这个handle将被以后使用的FTP函数使用。 $conn = ftp_connect(ftp.server.com); //一旦建立联接,使用ftp_login()发送一个用户名称和用户密码。你可以看到,这个函数ftp_login()使用了 ftp_connect()函数传来的handle,以确定用户名和密码能被提交到正确的服务器。 ftp_login($conn,“doe”); // close connection ftp_quit($conn); //登录了FTP服务器,PHP提供了一些函数,它们能获取一些关于系统和文件以及目录的信息。 ftp_pwd() //获取当前所在的目录 $here = ftp_pwd($conn); //获取服务器端系统信息ftp_systype() $server_os = ftp_systype($conn); //被动模式(PASV)的开关,打开或关闭PASV(1表示开) ftp_pasv($conn,1); //进入目录中用ftp_chdir()函数,它接受一个目录名作为参数。 ftp_chdir($conn,“public_html”); //回到所在的目录父目录用ftp_cdup()实现 ftp_cdup($conn); //建立或移动一个目录,这要使用ftp_mkdir()和ftp_rmdir()函数;注意:ftp_mkdir()建立成功的话,就会返回新建立的目录名。 ftp_mkdir($conn,“test”); ftp_rmdir($conn,“test”); //上传文件,ftp_put()函数能很好的胜任,它需要你指定一个本地文件名,上传后的文件名以及传输的类型。比方说:如果你想上传 “abc.txt”这个文件,上传后命名为“xyz.txt”,命令应该是这样: ftp_put($conn,“xyz.txt”,“abc.txt”,FTP_ASCII); //下载文件:PHP所提供的函数是ftp_get(),它也需要一个服务器上文件名,下载后的文件名,以及传输类型作为参数,例如:服务器端文件为his.zip,你想下载至本地机,并命名为hers.zip,命令如下: ftp_get($conn,“hers.zip”,“his.zip”,FTP_BINARY); //PHP提供两种方法:一种是简单列示文件名和目录,另一种就是详细的列示文件的大小,权限,创立时间等信息。 //第一种使用ftp_nlist()函数,第二种用ftp_rawlist().两种函数都需要一个目录名做为参数,都返回目录列做为一个数组,数组的每一个元素相当于列表的一行。 $filelist = ftp_nlist($conn,“.”); //函数ftp_size(),它返回你所指定的文件的大小,使用BITES作为单位。要指出的是,如果它返回的是 “-1”的话,意味着这是一个目录 $filelist = ftp_size($conn,“data.zip”); ?> FTP类 代码如下:/** * 仿写CodeIgniter的FTP类 * FTP基本操作: * 1) 登陆; connect * 2) 当前目录文件列表; filelist * 3) 目录改变;chgdir * 4) 重命名/移动;rename * 5) 创建文件夹;mkdir * 6) 删除;delete_dir/delete_file * 7) 上传;upload * 8) 下载download * * @author quanshuidingdang */ class Ftp { private $hostname= ''; private $username= ''; private $password= ''; private $port = 21; private $passive = TRUE; private $debug= TRUE; private $conn_id = FALSE;/** * 构造函数 * * @paramarray配置数组 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...); */ public function __construct($config = array()) { if(count($config) > 0) { $this->_init($config); } }/** * FTP连接 * * @access public * @param array 配置数组 * @returnboolean */ public function connect($config = array()) { if(count($config) > 0) { $this->_init($config); }if(FALSE === ($this->conn_id = @ftp_connect($this->hostname,$this->port))) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_connect"); } return FALSE; }if( ! $this->_login()) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_login"); } return FALSE; }if($this->passive === TRUE) { ftp_pasv($this->conn_id,TRUE); }return TRUE; }/** * 目录改变 * * @access public * @param string 目录标识(ftp) * @paramboolean * @returnboolean */ public function chgdir($path = '',$supress_debug = FALSE) { if($path == '' OR ! $this->_isconn()) { return FALSE; }$result = @ftp_chdir($this->conn_id,$path);if($result === FALSE) { if($this->debug === TRUE AND $supress_debug == FALSE) { $this->_error("ftp_unable_to_chgdir:dir[".$path."]"); } return FALSE; }return TRUE; }/** * 目录生成 * * @access public * @param string 目录标识(ftp) * @paramint 文件权限列表 * @returnboolean */ public function mkdir($path = '',$permissions = NULL) { if($path == '' OR ! $this->_isconn()) { return FALSE; }$result = @ftp_mkdir($this->conn_id,$path);if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_mkdir:dir[".$path."]"); } return FALSE; }if( ! is_null($permissions)) { $this->chmod($path,(int)$permissions); }return TRUE; }/** * 上传 * * @access public * @param string 本地目录标识 * @paramstring远程目录标识(ftp) * @paramstring上传模式 auto || ascii * @paramint上传后的文件权限列表 * @returnboolean */ public function upload($localpath,$remotepath,$mode = 'auto',$permissions = NULL) { if( ! $this->_isconn()) { return FALSE; }if( ! file_exists($localpath)) { if($this->debug === TRUE) { $this->_error("ftp_no_source_file:".$localpath); } return FALSE; }if($mode == 'auto') { $ext = $this->_getext($localpath); $mode = $this->_settype($ext); }$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;$result = @ftp_put($this->conn_id,$localpath,$mode);if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_upload:localpath[".$localpath."]/remotepath[".$remotepath."]"); } return FALSE; }if( ! is_null($permissions)) { $this->chmod($remotepath,(int)$permissions); }return TRUE; }/** * 下载 * * @access public * @param string 远程目录标识(ftp) * @paramstring本地目录标识 * @paramstring下载模式 auto || ascii * @returnboolean */ public function download($remotepath,$mode = 'auto') { if( ! $this->_isconn()) { return FALSE; }if($mode == 'auto') { $ext = $this->_getext($remotepath); $mode = $this->_settype($ext); }$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;$result = @ftp_get($this->conn_id,$mode);if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_download:localpath[".$localpath."]-remotepath[".$remotepath."]"); } return FALSE; }return TRUE; }/** * 重命名/移动 * * @access public * @param string 远程目录标识(ftp) * @paramstring新目录标识 * @paramboolean判断是重命名(FALSE)还是移动(TRUE) * @returnboolean */ public function rename($oldname,$newname,$move = FALSE) { if( ! $this->_isconn()) { return FALSE; }$result = @ftp_rename($this->conn_id,$oldname,$newname);if($result === FALSE) { if($this->debug === TRUE) { $msg = ($move == FALSE) ? "ftp_unable_to_rename" : "ftp_unable_to_move"; $this->_error($msg); } return FALSE; }return TRUE; }/** * 删除文件 * * @access public * @param string 文件标识(ftp) * @returnboolean */ public function delete_file($file) { if( ! $this->_isconn()) { return FALSE; }$result = @ftp_delete($this->conn_id,$file);if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_delete_file:file[".$file."]"); } return FALSE; }return TRUE; }/** * 删除文件夹 * * @access public * @param string 目录标识(ftp) * @returnboolean */ public function delete_dir($path) { if( ! $this->_isconn()) { return FALSE; }//对目录宏的'/'字符添加反斜杠'' $path = preg_replace("/(.+?)/*$/","1/",$path);//获取目录文件列表 $filelist = $this->filelist($path);if($filelist !== FALSE AND count($filelist) > 0) { foreach($filelist as $item) { //如果我们无法删除,那么就可能是一个文件夹 //所以我们递归调用delete_dir() if( ! @delete_file($item)) { $this->delete_dir($item); } } }//删除文件夹(空文件夹) $result = @ftp_rmdir($this->conn_id,$path);if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_delete_dir:dir[".$path."]"); } return FALSE; }return TRUE; }/** * 修改文件权限 * * @access public * @param string 目录标识(ftp) * @returnboolean */ public function chmod($path,$perm) { if( ! $this->_isconn()) { return FALSE; }//只有在PHP5中才定义了修改权限的函数(ftp) if( ! function_exists('ftp_chmod')) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_chmod(function)"); } return FALSE; }$result = @ftp_chmod($this->conn_id,$perm,$path);if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_chmod:path[".$path."]-chmod[".$perm."]"); } return FALSE; } return TRUE; }/** * 获取目录文件列表 * * @access public * @param string 目录标识(ftp) * @returnarray */ public function filelist($path = '.') { if( ! $this->_isconn()) { return FALSE; }return ftp_nlist($this->conn_id,$path); }/** * 关闭FTP * * @access public * @returnboolean */ public function close() { if( ! $this->_isconn()) { return FALSE; }return @ftp_close($this->conn_id); }/** * FTP成员变量初始化 * * @accessprivate * @paramarray配置数组 * @returnvoid */ private function _init($config = array()) { foreach($config as $key => $val) { if(isset($this->$key)) { $this->$key = $val; } } //特殊字符过滤 $this->hostname = preg_replace('|.+?://|','',$this->hostname); }/** * FTP登陆 * * @access private * @returnboolean */ private function _login() { return @ftp_login($this->conn_id,$this->username,$this->password); }/** * 判断con_id * * @access private * @returnboolean */ private function _isconn() { if( ! is_resource($this->conn_id)) { if($this->debug === TRUE) { $this->_error("ftp_no_connection"); } return FALSE; } return TRUE; }/** * 从文件名中获取后缀扩展 * * @access private * @param string 目录标识 * @returnstring */ private function _getext($filename) { if(FALSE === strpos($filename,'.')) { return 'txt'; }$extarr = explode('.',$filename); return end($extarr); }/** * 从后缀扩展定义FTP传输模式 ascii 或 binary * * @access private * @param string 后缀扩展 * @returnstring */ private function _settype($ext) { $text_type = array ( 'txt', 'text', 'php', 'phps', 'php4', 'js', 'css', 'htm', 'html', 'phtml', 'shtml', 'log', 'xml' );return (in_array($ext,$text_type)) ? 'ascii' : 'binary'; }/** * 错误日志记录 * * @access prvate * @returnboolean */ private function _error($msg) { return @file_put_contents('ftp_err.log',"date[".date("Y-m-d H:i:s")."]-hostname[".$this->hostname."]-username[".$this->username."]-password[".$this->password."]-msg[".$msg."]n",FILE_APPEND); } } /*End of file ftp.php*/ /*Location /Apache Group/htdocs/ftp.php*/ DEMO 代码如下:require_once('ftp.php'); $config = array( 'hostname' => 'localhost', 'username' => 'root', 'password' => 'root', 'port' => 21 ); $ftp = new Ftp(); $ftp->connect($config); $ftp->upload('ftp_err.log','ftp_upload.log'); $ftp->download('ftp_upload.log','ftp_download.log'); /*End of file ftp_demo.php*/ /*Location: /htdocs/ftp_demo.php*/ (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
