
<?php
/**
* ftp操作类
* @author chenzhouyu
*
*使用$ftps = pc_base::load_sys_class('ftps');进行初始化。
*首先通过 $ftps->connect($host,$username,$password,$post,$pasv,$ssl,$timeout);进行ftp服务器连接。
*通过具体的函数进行ftp的操作。
*$ftps->mkdir() 创建目录,可以创建多级目录以“/abc/def/higk”的形式进行多级目录的创建。
*$ftps->put()上传文件
*$ftps->rmdir()删除目录
*$ftps->f_delete()删除文件
*$ftps->nlist()列出指定目录的文件
*$ftps->chdir()变更当前文件夹
*$ftps->get_error()获取错误信息
*/
class ftps {
//ftp 连接资源
private $link;
//ftp连接时间
public $link_time;
//错误代码
private $err_code = 0;
//传送模式{文本模式:ftp_ascii, 二进制模式:ftp_binary}
public $mode = ftp_binary;
/**
* 连接ftp服务器
* @param string $host 服务器地址
* @param string $username 用户名
* @param string $password 密码
* @param integer $port 服务器端口,默认值为21
* @param boolean $pasv 是否开启被动模式
* @param boolean $ssl 是否使用ssl连接
* @param integer $timeout 超时时间
*/
public function connect($host, $username = '', $password = '', $port = '21', $pasv = false, $ssl = false, $timeout = 30) {
$start = time();
if ($ssl) {
if (!$this->link = @ftp_ssl_connect($host, $port, $timeout)) {
$this->err_code = 1;
return false;
}
} else {
if (!$this->link = @ftp_connect($host, $port, $timeout)) {
}
if (@ftp_login($this->link, $username, $password)) {
if ($pasv) ftp_pasv($this->link, true);
$this->link_time = time()-$start;
return true;
$this->err_code = 1;
return false;
register_shutdown_function(array(&$this,'close'));
}
* 创建文件夹
* @param string $dirname 目录名,
public function mkdir($dirname) {
if (!$this->link) {
$this->err_code = 2;
return false;
}
$dirname = $this->ck_dirname($dirname);
$nowdir = '/';
foreach ($dirname as $v) {
if ($v && !$this->chdir($nowdir.$v)) {
if ($nowdir) $this->chdir($nowdir);
@ftp_mkdir($this->link, $v);
if($v) $nowdir .= $v.'/';
return true;
* 上传文件
* @param string $remote 远程存放地址
* @param string $local 本地存放地址
public function put($remote, $local) {
$dirname = pathinfo($remote,pathinfo_dirname);
if (!$this->chdir($dirname)) {
$this->mkdir($dirname);
if (@ftp_put($this->link, $remote, $local, $this->mode)) {
return true;
$this->err_code = 7;
* 删除文件夹
* @param string $dirname 目录地址
* @param boolean $enforce 强制删除
public function rmdir($dirname, $enforce = false) {
$list = $this->nlist($dirname);
if ($list && $enforce) {
$this->chdir($dirname);
foreach ($list as $v) {
$this->f_delete($v);
} elseif ($list && !$enforce) {
$this->err_code = 3;
@ftp_rmdir($this->link, $dirname);
* 删除指定文件
* @param string $filename 文件名
public function f_delete($filename) {
if (@ftp_delete($this->link, $filename)) {
$this->err_code = 4;
* 返回给定目录的文件列表
* @return array 文件列表数据
public function nlist($dirname) {
if ($list = @ftp_nlist($this->link, $dirname)) {
return $list;
$this->err_code = 5;
* 在 ftp 服务器上改变当前目录
* @param string $dirname 修改服务器上当前目录
public function chdir($dirname) {
if (@ftp_chdir($this->link, $dirname)) {
$this->err_code = 6;
* 获取错误信息
public function get_error() {
if (!$this->err_code) return false;
$err_msg = array(
'1'=>'server can not connect',
'2'=>'not connect to server',
'3'=>'can not delete non-empty folder',
'4'=>'can not delete file',
'5'=>'can not get file list',
'6'=>'can not change the current directory on the server',
'7'=>'can not upload files'
);
return $err_msg[$this->err_code];
* 检测目录名
* @param string $url 目录
* @return 由 / 分开的返回数组
private function ck_dirname($url) {
$url = str_replace('\\', '/', $url);
$urls = explode('/', $url);
return $urls;
* 关闭ftp连接
public function close() {
return @ftp_close($this->link);
}
阿斯