php ftp类封装,PHP 之ftp类封装

* Class FtpClient*/

classFtpClient

{private $host = ‘‘;//远程服务器地址

private $user = ‘‘;//ftp用户名

private $pass = ‘‘;//ftp密码

private $port = 21;//ftp登录端口

private $error = ‘‘;//最后失败时的错误信息

protected $conn;//ftp登录资源

/**

* 可以在实例化类的时候配置数据,也可以在下面的connect方法中配置数据

* Ftp constructor.

* @param array $config*/

public function __construct(array $config =[])

{empty($config) OR $this->initialize($config);

}/**

* 初始化数据

* @param array $config 配置文件数组*/

public function initialize(array $config =[])

{$this->host = $config[‘host‘];$this->user = $config[‘user‘];$this->pass = $config[‘pass‘];$this->port = isset($config[‘port‘]) ?: 21;

}/**

* 连接及登录ftp

* @param array $config 配置文件数组

* @return bool*/

public function connect(array $config =[])

{empty($config) OR $this->initialize($config);if (FALSE == ($this->conn = @ftp_connect($this->host))) {$this->error = "主机连接失败";return FALSE;

}if (!$this->_login()) {$this->error = "服务器登录失败";return FALSE;

}return TRUE;

}/**

* 上传文件到ftp服务器

* @param string $local_file 本地文件路径

* @param string $remote_file 服务器文件地址

* @param string $mode 上传模式(ascii和binary其中之一)

* @param null $permissions 文件夹权限

* @return bool*/

public function upload($local_file = ‘‘, $remote_file = ‘‘, $mode = ‘auto‘, $permissions = NULL)

{if (!file_exists($local_file)) {$this->error = "本地文件不存在";return FALSE;

}if ($mode == ‘auto‘) {$ext = $this->_get_ext($local_file);$mode = $this->_set_type($ext);

}//创建文件夹

$this->_create_remote_dir($remote_file);$mode = ($mode == ‘ascii‘) ? FTP_ASCII :FTP_BINARY;$result = @ftp_put($this->conn, $remote_file, $local_file, $mode);//同步上传

if ($result === FALSE) {$this->error = "文件上传失败";return FALSE;

}return TRUE;

}/**

* 从ftp服务器下载文件到本地

* @param string $local_file 本地文件地址

* @param string $remote_file 远程文件地址

* @param string $mode 上传模式(ascii和binary其中之一)

* @return bool*/

public function download($local_file = ‘‘, $remote_file = ‘‘, $mode = ‘auto‘)

{if ($mode == ‘auto‘) {$ext = $this->_get_ext($remote_file);$mode = $this->_set_type($ext);

}$mode = ($mode == ‘ascii‘) ? FTP_ASCII :FTP_BINARY;$result = @ftp_get($this->conn, $local_file, $remote_file, $mode);if ($result === FALSE) {return FALSE;

}return TRUE;

}/**

* 删除ftp服务器端文件

* @param string $remote_file 文件地址

* @return bool*/

public function delete_file($remote_file = ‘‘)

{$result = @ftp_delete($this->conn, $remote_file);if ($result === FALSE) {return FALSE;

}return TRUE;

}/**

* ftp创建多级目录

* @param string $remote_file 要上传的远程图片地址

* @param null $permissions 修改目录权限*/

private function _create_remote_dir($remote_file = ‘‘, $permissions = NULL)

{$remote_dir = dirname($remote_file);$path_arr = explode(‘/‘, $remote_dir); //取目录数组

//$file_name = array_pop($path_arr); // 弹出文件名

$path_div = count($path_arr); //取层数

foreach ($path_arr as $val) //创建目录

{if (@ftp_chdir($this->conn, $val) == FALSE) {$tmp = @ftp_mkdir($this->conn, $val);//此处创建目录时不用使用绝对路径(不要使用:2018-02-20/ceshi/ceshi2,这种路径),因为下面ftp_chdir已经已经把目录切换成当前目录

if ($tmp == FALSE) {echo "目录创建失败,请检查权限及路径是否正确!";exit;

}if ($permissions !== NULL) {//修改目录权限

$this->_chmod($val, $permissions);

}

@ftp_chdir($this->conn, $val);

}

}for ($i = 0; $i < $path_div; $i++) //回退到根,因为上面的目录切换导致当前目录不在根目录

{

@ftp_cdup($this->conn);

}

}/**

* 递归删除ftp端目录

* @param string $remote_dir ftp目录地址

* @return bool*/

public function delete_dir($remote_dir = ‘‘)

{$list = $this->list_file($remote_dir);if (!empty($list)) {$count = count($list);for ($i = 0; $i < $count; $i++) {if (!preg_match(‘#\.#‘, $list[$i]) && !@ftp_delete($this->conn, $list[$i])) {//这是一个目录,递归删除

$this->delete_dir($list[$i]);

}else{$this->delete_file($list[$i]);

}

}

}if (@ftp_rmdir($this->conn, $remote_dir) === FALSE) {return FALSE;

}return TRUE;

}/**

* 更改 FTP 服务器上的文件或目录名

* @param string $old_file 旧文件/文件夹名

* @param string $new_file 新文件/文件夹名

* @return bool*/

public function remane($old_file = ‘‘, $new_file = ‘‘)

{$result = @ftp_rename($this->conn, $old_file, $new_file);if ($result === FALSE) {$this->error = "移动失败";return FALSE;

}return TRUE;

}/**

*

* @param string $remote_path*/

/**

* 列出ftp指定目录

* @param string $remote_path 服务器上的路径

* @return array*/

public function list_file($remote_path = ‘‘)

{$contents = @ftp_nlist($this->conn, $remote_path);return $contents;

}/**

* 获取文件的后缀名

* @param string $local_file 本地文件

* @return bool|string*/

private function _get_ext($local_file = ‘‘)

{return (($dot = strrpos($local_file, ‘.‘)) == FALSE) ? ‘txt‘ : substr($local_file, $dot + 1);

}/**

* 根据文件后缀获取上传编码

* @param string $ext

* @return string*/

private function _set_type($ext = ‘‘)

{//如果传输的文件是文本文件,可以使用ASCII模式,如果不是文本文件,最好使用BINARY模式传输。

return in_array($ext, [‘txt‘, ‘text‘, ‘php‘, ‘phps‘, ‘php4‘, ‘js‘, ‘css‘, ‘htm‘, ‘html‘, ‘phtml‘, ‘shtml‘, ‘log‘, ‘xml‘], TRUE) ? ‘ascii‘ : ‘binary‘;

}/**

* 修改目录权限

* @param $path 目录路径

* @param int $mode 权限值

* @return bool*/

private function _chmod($path, $mode = 0755)

{if (FALSE == @ftp_chmod($this->conn, $path, $mode)) {return FALSE;

}return TRUE;

}/**

* 登录Ftp服务器

* @return bool*/

private function_login()

{return @ftp_login($this->conn, $this->user, $this->pass);

}/**

* 获取上传错误信息

* @return string*/

public functionget_error_msg()

{return $this->error;

}/**

* 关闭ftp连接

* @return bool*/

public functionclose()

{return $this->conn ? @ftp_close($this->conn_id) : FALSE;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值