欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

最新最全的PHP FTP操作类,来自EaglePHP框架

程序员文章站 2022-06-01 15:59:16
...
最新最全的PHP FTP操作类,来自EaglePHP框架
<?php

/**
 * 
 * EaglePHP FTP操作类
 * 
 * @author maojianlw@139.com
 * @link http://www.eaglephp.com
 * @since 2013-06-18
 */

class Ftp
{
	
	/**
	 * 
	 * 用户名
	 * 
	 * @var string
	 */
	private static $username = null;
	
	
	/**
	 * 
	 * 密码
	 * 
	 * @var string
	 */
	private static $password = null;
	
	
	/**
	 * 
	 * 连接的服务器
	 * 
	 * @var string
	 */
	private static $host = null;
	
	/**
	 * 
	 * 连接资源句柄
	 * 
	 * @var resource
	 */
	private static $resource = null;
	
	
	/**
	 * 
	 * 连接并登陆ftp服务器
	 * 
	 * @param string $host
	 * @param string $username
	 * @param string $password
	 * @param int $port
	 * @param int $timeout
	 * @param bool $pasv
	 * @return bool
	 */
	public static function connect($host, $username, $password, $port=21, $timeout=90, $pasv = false)
	{
		if(!extension_loaded('ftp')) throw_exception(language('SYSTEM:module.not.loaded', array('ftp')));
        if((self::$resource = ftp_connect($host, $port, $timeout)) === false) throw_exception('ftp_unable_to_connect');
        if(!self::login($username, $password)) throw_exception('ftp_unable_to_login');
        if($pasv === true) self::pasv($pasv);
        return true;
	}
	
	
	/**
	 * 
	 * 登录 FTP 服务器
	 * 
	 * @param string $username
	 * @param string $password
	 * @return bool
	 */
	public static function login($username, $password)
	{
		return ftp_login(self::$resource, $username, $password);
	}
	
	
	/**
	 * 
	 * 切换目录至当前目录的父目录 (上级目录)
	 * 
	 * @return bool
	 */
	public static function cdup()
	{
		return ftp_cdup(self::$resource);
	}
	
	
	/**
	 * 
	 * 将当前目录切换为指定的目录
	 * 
	 * @param string $directory
	 * @return bool
	 */
	public static function chdir($directory)
	{
		return ftp_chdir(self::$resource, $directory);
	}
	
	/**
	 * 
	 * 设置在指定的远程文件的权限模式
	 * 
	 * @param int $mode
	 * @param string $filename
	 * @return bool
	 */
	public static function chmod($mode, $filename)
	{
		return ftp_chmod(self::$resource, $mode, $filename);
	}
	
	
	/**
	 * 
	 * 关闭ftp连接标识符并释放资源
	 * 
	 * @return bool
	 */
	public static function close()
	{
		return ftp_close(self::$resource);
	}
	
	
	/**
	 * 
	 *  ftp_close() 的 别名
	 *  
	 *  @return bool
	 */
	public static function quit()
	{
		return self::close();
	}
	
	
	/**
	 * 
	 * 删除 FTP 服务器上的一个文件
	 * 
	 * @param string $path
	 * @return bool
	 */
	public static function delete($path)
	{
		return ftp_delete(self::$resource, $path);
	}
	
	
	/**
	 * 
	 * 请求运行一条 FTP 命令
	 * 
	 * @param string $command
	 * @return bool
	 */
	public static function exec($command)
	{
		return ftp_exec(self::$resource, $command);
	}
	
	/**
	 * 
	 * 发送到FTP服务器的任意命令
	 * 
	 * @param string $command
	 * @return array
	 */
	public static function raw($command)
	{
		return ftp_raw(self::$resource, $command);
	}
	
	
	/**
	 * 
	 * 从 FTP 服务器上下载一个文件并保存到本地一个已经打开的文件中
	 * 
	 * @param resource $handle 本地已经打开的文件的句柄
	 * @param string $remote_file  远程文件
	 * @param int $mode  传送模式参数 mode 必须是 (文本模式) FTP_ASCII 或 (二进制模式) FTP_BINARY 中的一个
	 * @param int $resumepos
	 * @return bool
	 */
	public static function fget($handle, $remote_file, $mode=FTP_ASCII, $resumepos=0)
	{
		return ftp_fget(self::$resource, $handle, $remote_file, $mode, $resumepos);
	}
	
	
	/**
	 * 
	 * 上传一个已经打开的文件到 FTP 服务器
	 * 
	 * @param string $remote_file
	 * @param resource $handle
	 * @param int $mod
	 * @param int $startpos
	 * @return bool
	 */
	public static function fput($remote_file, $handle, $mod=FTP_ASCII, $startpos=0)
	{
		return ftp_fput(self::$resource, $remote_file, $handle, $mode, $startpos);
	}
	
	
	/**
	 * 
	 * 返回当前 FTP 连接的各种不同的选项设置
	 * 
	 * @param int $option
	 * @return mixed
	 */
	public static function getOption($option)
	{
		return ftp_get_option(self::$resource, $option);
	}
	
	
	/**
	 * 
	 * 设置各种 FTP 运行时选项
	 * 
	 * @param int $option
	 * @param mixed $value
	 * @return bool
	 */
	public static function setOption($option, $value)
	{
		return ftp_set_option(self::$resource, $option, $value);
	}
	
	
	/**
	 * 
	 * 从 FTP 服务器上下载一个文件
	 * 
	 * @param string $local_file
	 * @param string $remote_file
	 * @param int $mode
	 * @param int $resumepos
	 * @return bool
	 */
	public static function get($local_file, $remote_file, $mode=FTP_ASCII, $resumepos=0)
	{
		return ftp_get(self::$resource, $local_file, $remote_file, $mode, $resumepos);	
	}
	
	
	
	/**
	 * 
	 * 上传文件到 FTP 服务器
	 * 
	 * @param string $remote_file
	 * @param string $local_file
	 * @param int $mode
	 * @param int $startpos
	 * @return bool
	 */
	public static function put($remote_file, $local_file, $mode=FTP_ASCII, $startpos=0)
	{
		return ftp_put(self::$resource, $remote_file, $local_file, $mode, $startpos);
	}
	
	
	/**
	 * 
	 * 返回指定文件的最后修改时间
	 * 
	 * @param string $remote_file
	 */
	public static function mdtm($remote_file)
	{
		return ftp_mdtm(self::$resource, $remote_file);
	}
	
	
	
	/**
	 * 
	 * 递归创建目录并授权
	 * 
	 * @param string $directory
	 * @param int $mode 权限模式
	 * @return string 如果成功返回新建的目录名,否则返回 FALSE
	 */
	public static function mkdir($directory, $mode=null)
	{
		if(empty($directory)) return false;
	    if(self::isDir($directory)) return true;
	    if(!self::mkdir(dirname($directory), $mode)) return false;
	    if(!ftp_mkdir(self::$resource, $directory)) return false;
	    if(!is_null($mode)) self::chmod($mode, $directory);
		return true;
	}
	
	
	/**
	 * 
	 *  递归删除 FTP服务器上的目录
	 *  
	 * @param string $directory
	 * @return bool
	 */
	public static function rmdir($directory)
	{
		$list = self::nlist($directory);
		if($list !== false && count($list) > 0)
		{
			foreach ($list as $k=>$v)
			{
				$path = "{$directory}/{$v}";
				if(self::isDir($path)) self::rmdir($path);
				else self::delete($path);
			}
		}
		return ftp_rmdir(self::$resource, $directory);
	}
	
	
	/**
	 * 
	 * 连续获取/发送文件(non-blocking)
	 * 以不分块的方式连续获取/发送一个文件。 
	 * 
	 * @return int 返回常量 FTP_FAILED 或 FTP_FINISHED 或 FTP_MOREDATA
	 */
	public static function nbContinue()
	{
		return ftp_nb_continue(self::$resource);
	}
	
	
	/**
	 * 从检索FTP服务器上的文件并将其写入一个打开的文件(非阻塞)
	 * 
	 * @param resource $handle
	 * @param string $remote_file
	 * @param int $mode
	 * @param int $resumepos
	 * @return int 返回ftp_failed或ftp_finished或ftp_moredata
	 */
	public static function nbFget($handle, $remote_file, $mode=FTP_ASCII, $resumepos=0)
	{
		return ftp_nb_fget(self::$resource, $handle, $remote_file, $mode, $resumepos);
	}
	
	
	/**
	 * 
	 * 从打开的文件到FTP服务器上的文件(非阻塞)
	 * 
	 * @param unknown_type $remote_file
	 * @param unknown_type $handle
	 * @param unknown_type $mode
	 * @param unknown_type $startpos
	 */
	public static function nbFput($remote_file, $handle, $mode=FTP_ASCII, $startpos=0)
	{
		return ftp_nb_fput(self::$resource, $remote_file, $handle, $mode, $startpos);
	}
	
	
	
	/**
	 * 
	 * 从 FTP 服务器上获取文件并写入本地文件(non-blocking)
	 * 
	 * @param string $local_file
	 * @param string $remote_file
	 * @param int $mode
	 * @param int $resumepos
	 * @return int  返回 FTP_FAILED,FTP_FINISHED 或 FTP_MOREDATA
	 */
	public static function nbGet($local_file, $remote_file, $mode=FTP_ASCII, $resumepos=0)
	{
		return ftp_nb_get(self::$resource, $local_file, $remote_file, $mode, $resumepos);
	}
	
	
	/**
	 * 
	 * 存储一个文件至 FTP 服务器(non-blocking)
	 * 
	 * @param string $remote_file
	 * @param string $local_file
	 * @param int $mode
	 * @param int $startpos
	 * @return int  返回 FTP_FAILED,FTP_FINISHED 或 FTP_MOREDATA
	 */
	public static function nbPut($remote_file, $local_file, $mode=FTP_ASCII, $startpos=0)
	{
		return ftp_nb_put(self::$resource, $remote_file, $local_file, $mode, $startpos);
	}
	
	
	/**
	 *
	 * 返回给定目录的文件列表
	 * 
	 * @param string $directory
	 * @return array
	 */
	public static function nlist($directory)
	{
		return ftp_nlist(self::$resource, $directory);
	}
	
	
	/**
	 * 
	 * 返回当前 FTP 被动模式是否打开
	 * 在被动模式打开的情况下,数据的传送由客户机启动,而不是由服务器开始。 
	 * 
	 * @param bool $pasv
	 * @return bool
	 */
	public static function pasv($pasv)
	{
		return ftp_pasv(self::$resource, $pasv);
	}
	
	
	/**
	 * 
	 * 返回当前目录名
	 * 
	 * @return string
	 */
	public static function pwd()
	{
		return ftp_pwd(self::$resource);
	}
	
	
	/**
	 * 
	 * 返回指定目录下文件的详细列表
	 * 将执行 FTP LIST 命令,并把结果做为一个数组返回
	 * 
	 * @param string $directory
	 * @return array
	 */
	public static function rawlist($directory)
	{
		return ftp_rawlist(self::$resource, $directory);
	}
	
	
	/**
	 * 
	 * 更改 FTP 服务器上的文件或目录名
	 * 
	 * @param string $oldname
	 * @param string $newname
	 * @return bool
	 */
	public static function rename($oldname, $newname)
	{
		return ftp_rename(self::$resource, $oldname, $newname);
	}
	
	
	/**
	 * 
	 * 向服务器发送 SITE 命令
	 * 
	 * @param string $command
	 * @return bool
	 */
	public static function site($command)
	{
		return ftp_site(self::$resource, $command);
	}
	
	
	/**
	 * 
	 * 返回指定文件的大小
	 * 
	 * @param string $remote_file
	 * @return int  如果指定文件不存在或发生错误,则返回 -1。有些 FTP 服务器可能不支持此特性。 
	 */
	public static function size($remote_file)
	{
		return ftp_size(self::$resource, $remote_file);
	}
	
	
	/**
	 * 
	 * 打开一个安全的ssl-ftp连接
	 * 注:此函数需要OpenSSL扩展库支持
	 * 
	 * @param string $host
	 * @param int $port
	 * @param int $timeout
	 * @return resource
	 */
	public static function sslConnect($host, $port=21, $timeout=90)
	{
		return ftp_ssl_connect($host, $port, $timeout);
	}
	
	
	/**
	 * 
	 * 返回远程 FTP 服务器的操作系统类型
	 * 
	 * @return string
	 */
	public static function systype()
	{
		return ftp_systype(self::$resource);
	}
	
	
	/**
	 * 
	 * 发送一个配置命令远程FTP服务器对上传的文件分配空间。
	 * 注:许多FTP服务器不支持这个命令。
	 *  
	 * @param int $filesize 分配的字节数。
	 * @param string $result 服务器的响应文本表示将通过引用返回的结果如果提供一个变量。
	 * @return bool
	 */
	public static function alloc($filesize,  &$result='')
	{
		return ftp_alloc(self::$resource, $filesize, $result);
	}
	
	
	/**
	 * 
	 * 判断是否为目录
	 * 
	 * @param string $remote_file
	 * @return bool
	 */
	public static function isDir($remote_file)
	{
		return (self::size($remote_file) === -1 && self::rawlist($remote_file) !== false) ? true : false;
	}
	
	
	/**
	 * 
	 * 根据文件后缀获取ftp传输模式
	 * 
	 * @param string $file
	 * @return string
	 */
	private static function _getTransferMode($file)
	{
		$extArr = array('txt', 'text', 'php', 'phps', 'php4', 'js', 'css', 'htm', 'html', 'phtml', 'shtml', 'log', 'xml');
		if(($pos = strrpos($file, '.')) === false) return FTP_ASCII;
		$ext = substr($file, $pos + 1);
		return in_array($ext, $extArr) ? FTP_ASCII : FTP_BINARY;
	}
	
	
	/**
	 * 
	 * 上传文件至FTP服务器
	 * 
	 * @param string $local_file
	 * @param string $remote_file
	 * @param int $mode
	 * @param int $permissions
	 * @return void
	 */
	public static function upload($local_file, $remote_file, $mode=null, $permissions = null)
	{
		if(!file_exists($local_file)) throw_exception('ftp_no_source_file:'.$local_file);
		$mode = is_null($mode) ? self::_getTransferMode($local_file) : $mode;
		if(!self::put($remote_file, $local_file, $mode)) throw_exception("ftp_unable_to_upload:local_file[{$local_file}]/remote_file[{$remote_file}]");
		if(!is_null($permissions)) self::chmod($permissions, $remote_file);
		return true;
	}
	
	
	/**
	 * 
	 * 上传目录至FTP服务器
	 * 注:上传的中目录或文件名不能包含中文
	 * 
	 * @param string $local_dir
	 * @param string $remote_dir
	 * @param int $mode
	 * @param int $permissions
	 */
	public static function uploadDir($local_dir, $remote_dir, $permissions = null)
	{
		$list = Folder::read($local_dir);
		if(count($list) > 0)
		{
			if(!self::isDir($remote_dir)) self::mkdir($remote_dir, $permissions);
			foreach ($list as $k=>$v)
			{
				$local_path = $local_dir.'/'.$v;
				$remote_path = $remote_dir.'/'.$v;
				if(Folder::isDir($local_path)) self::uploadDir($local_path, $remote_path);
				else self::upload($local_path, $remote_path, null, $permissions);
			}
			return true;
		}
		return false;
	}
	
	
	/**
	 * 
	 * 从ftp下载文件至本地
	 * 
	 * @param string $remote_file
	 * @param string $local_file
	 * @param int $mode
	 * @return bool
	 */
	public static function download($remote_file, $local_file, $mode = null)
	{
		$mode = is_null($mode) ? self::_getTransferMode($remote_file) : $mode;
		if(!self::get($local_file, $remote_file, $mode)) throw_exception("ftp_unable_to_download:local_file[{$local_file}]-remote_file[{$remote_file}]");
		return true;
	}
	
	
	/**
	 * 
	 * 下载ftp上的文件夹至本地
	 * 
	 * @param string $remote_dir
	 * @param string $local_dir
	 */
	public static function downloadDir($remote_dir, $local_dir)
	{
		$list = self::nlist($remote_dir);
		if(count($list) > 0)
		{
			if(!Folder::isDir($local_dir)) mk_dir($local_dir);
			foreach ($list as $k=>$v)
			{
				$remote_path = $remote_dir.'/'.$v;
				$local_path = $local_dir.'/'.$v;
				if(self::isDir($remote_path)) self::downloadDir($remote_path, $local_path);
				else self::download($remote_path, $local_path);
			}
			return true;
		}
		return false;
	}
	
	
}



测试代码:
Ftp::connect('192.168.16.188', 'test', '123456');
//$a = Ftp::get('d:/t.txt', 'php.ini');
//$a = Date::format('Y-m-d H:i:s', Ftp::mdtm('php.ini'));
//$a = Ftp::mkdir('maojian');
//$a = Ftp::nlist('test');
//$a = Ftp::pwd();
//$a = Ftp::rawlist('bak');
//$a = Ftp::rename('1111', 'aaa_ftp_test');
//$a = Ftp::mkdir('/qq/1111/2222/');
//$a = Ftp::rmdir('hahaha');
//$a = Ftp::systype();
//$a = Ftp::isDir('aaa_ftp_test/tttt/');
//$a = Ftp::upload('d:/aaa.txt', 'aaa.txt');
//$a = Ftp::delete('aaa.txt');
//$a = Ftp::uploadDir('d:/TDDownload', '/hahaha');
//$a = Ftp::downloadDir('/hahaha', 'd:/aaaa');
var_dump($a);

以上就是最新最全的PHP FTP操作类,来自EaglePHP框架的内容,更多相关内容请关注PHP中文网(www.php.cn)!