php 上传 ftp 源码,php文件上传到远程ftp服务器代码封装

经常在项目中遇见将文件上传到远程的ftp服务器,自己封装了一个ftp文件上传类<?php

class Ftp {

/**

* 上传文件根目录

* @var string

*/

private $rootPath;

/**

* 本地上传错误信息

* @var string

*/

private $error = ''; //上传错误信息

/**

* FTP连接

* @var resource

*/

private $link;

private $config = array(

'host'     => '', //服务器

'port'     => 21, //端口

'timeout'  => 90, //超时时间

'username' => '', //用户名

'password' => '', //密码

);

/**

* 构造函数,用于设置上传根路径

* @param array  $config FTP配置

*/

public function __construct($config = array()){

/* 默认FTP配置 */

$this->config = array_merge($this->config, $config);

/* 登录FTP服务器 */

if(!$this->login()){

throw new \Exception($this->error);

}

}

/**

* 检测上传根目录

* @param string $rootpath   根目录

* @return boolean true-检测通过,false-检测失败

*/

public function checkRootPath($rootpath){

/* 设置根目录 */

$this->rootPath = ftp_pwd($this->link) . '/' . ltrim($rootpath, '/');

if(!@ftp_chdir($this->link, $this->rootPath)){

$this->error = '上传根目录不存在!';

return false;

}

return true;

}

/**

* 检测上传目录

* @param  string $savepath 上传目录

* @return boolean          检测结果,true-通过,false-失败

*/

public function checkSavePath($savepath){

/* 检测并创建目录 */

if (!$this->mkdir($savepath)) {

return false;

} else {

//TODO:检测目录是否可写

return true;

}

}

/**

* 保存指定文件

* @param  array   $file    保存的文件信息

* @param  boolean $replace 同名文件是否覆盖

* @return boolean          保存状态,true-成功,false-失败

*/

public function save($file, $replace=true) {

$filename = '/'.$file['rootpath'] .'/'. $file['savepath'] .'/'. $file['savename'];

//pr($filename);exit;

/* 不覆盖同名文件 */

// if (!$replace && is_file($filename)) {

//     $this->error = '存在同名文件' . $file['savename'];

//     return false;

// }

/* 移动文件 */

if (!ftp_put($this->link, $filename, $file['tmp_name'], FTP_BINARY)) {

$this->error = '文件上传保存错误!';

return false;

}

return true;

}

/**

* 创建目录

* @param  string $savepath 要创建的目录

* @return boolean          创建状态,true-成功,false-失败

*/

public function mkdir($savepath){

$dir =  $savepath;

if(@ftp_chdir($this->link, $dir)){

return true;

}

if(@ftp_mkdir($this->link, $dir)){

return true;

} elseif($this->mkdir(dirname($savepath)) && ftp_mkdir($this->link, $dir)) {

return true;

} else {

$this->error = "目录 {$savepath} 创建失败!";

return false;

}

}

/**

* 获取最后一次上传错误信息

* @return string 错误信息

*/

public function getError(){

return $this->error;

}

/**

* 登录到FTP服务器

* @return boolean true-登录成功,false-登录失败

*/

private function login(){

extract($this->config);

$this->link = ftp_connect($host, $port, $timeout);

if($this->link) {

if (ftp_login($this->link, $username, $password)) {

ftp_pasv($this->link ,true);

return true;

} else {

$this->error = "无法登录到FTP服务器:username - {$username}";

}

} else {

$this->error = "无法连接到FTP服务器:{$host}";

}

return false;

}

/**

* 析构方法,用于断开当前FTP连接

*/

public function __destruct() {

ftp_close($this->link);

}

}

?>

//文件调用

$config =array(

'ftp' => array(

'host' => '192.168.111.1',//主机名称

'port' => 21,   //端口号

'timeout' => 90, //超时时间

'username' => 'ftp', 账号

'password' => '123456',  密码

)

);

$file = $_FILES['file'];

$time = getTimeStamp();

$rootdir ="fireware";

$dirdate = date('Ym',$time);

$fileName = $file['name'];

if(!in_array(substr(strrchr($fileName, '.'), 1),array('rbin','ubin','bin'))){

$this->ajaxReturn(405405,L('lang_dev_index12'));

}

$config = (array)$this->config->ftp;

$ftp = new Ftp($config);

$rootpath = $ftp->checkRootPath($rootdir); //检测上传根目录存在不存在

if(!$rootpath){

$ftp->mkdir($rootdir);

}

$savepath = $ftp->checkSavePath("/".$rootdir.'/'.$dirdate); //检查上传目录存在不存在

if(!$savepath){

$ftp->mkdir($dirdate);

}

$data =array(

'rootpath'=>$rootdir,

'savepath'=>$dirdate,

'savename'=>$fileName

);

$info = array_merge($file,$data);

$upinfo = $ftp->save($info);

if($upinfo){

//成功处理逻辑

}else{

//失败处理逻辑

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值