php实现通过ftp上传文件


Posted in PHP onJune 19, 2015

大概原理

遍历项目中的所有非排除文件,然后获取 文件修改时间晚于文件上一次修改时间 的文件

然后将这些文件,通过ftp上传到对应的目录

具体代码如下:

因为只是工具,代码很乱,见谅

<?php
error_reporting(7);
if ($_SERVER['SERVER_ADDR'])exit;//禁止在web服务器下运行
$_GET['exclude'] = array('number.txt','uploads','Zend','docs','cache','You','managesdk'); //排除上传目录,定义为全局变量
$fileobj = new FilerFile();
$path = "/data/longtu/"; //项目目录的根目录
$files = $fileobj->Zip($path); //过滤出最新的修改文件
$path = str_replace("/data/longtu/","",$path);
$config = array(
  'hostname' => 'xxx.xxx.xx.xxx', //ftp服务器 地址
  'username' => 'xxx',     //ftp用户
  'password' => '?xxxxxxxxxxx', //ftp密码
  'port' => 21         //端口
);
$ftp = new Ftp();
$ftp->connect($config);       //链接服务器
//$a=$ftp->filelist();
$LOCAL_ROOT = realpath(dirname(__DIR__)."/../../");
chdir($LOCAL_ROOT);
foreach ($files as $k=>$v){
  $f = $path.$v;
  $tmp = $ftp->upload($f, $f);
  if($tmp){
  echo "upload $f -> success \n";
  }
}
//$ftp->download('ftp_upload.log','ftp_download.log');
//
//$ftp->upload('ftp_err.log','ftp_upload.log');
//$ftp->download('ftp_upload.log','ftp_download.log');
/*
 *
 *
 * $dir = "/test";
 if(@ftp_chdir($conn, $dir))
  判断是否为文件夹
 * Enter description here ...
 * @author Administrator
 *
 */
class FilerFile
{
 var $time_path;
 private $fctimes = array();
 function Zip($dir)
 {
  $this->time_path = rtrim($dir,"/")."/.~~~time.php";
  //@unlink($this->time_path);
  $filelist = $this -> GetFileList($dir);
  file_put_contents($this->time_path,"<?php \n return ".var_export($this->fctimes,true).";");
  return $filelist;
 }
 function appendFilectime($file)
 {
  $time_file_path = $this->time_path;
  $ftime = @include($time_file_path);
  $ftime = $ftime ? $ftime : array();
  $time = filectime($file);
  if(!file_exists($time_file_path))file_put_contents($time_file_path,"<?php \n");
 }
 function getFileByFilectime($file)
 {
  static $time_data ;
  $time_file_path = $this->time_path;
  if (!$time_data){
   $time_data= @include_once($time_file_path);
  }
  $time_data = $time_data ? $time_data : array();
  //var_dump($file,$time_data[$file] == filectime($file));
  //echo $file."\t".$time_data[$file]."\n";
  if ($time_data[$file] == filemtime($file)){
   return false;
  }else{
   return $file;
  }
 }
 function GetFileList($dir,$path="")
 {
  static $tmpp = "";
  if ($path=="" && !$tmpp){
   $tmpp = $dir;
  }
  $d = dir($dir);
  $files = array();
  if ($d)
  {
   $pathP=str_replace($tmpp,"",$dir);
   $pathP=str_replace(array("\\\\","/"),DIRECTORY_SEPARATOR,$pathP);
   $pathP=str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR,DIRECTORY_SEPARATOR,$pathP);
   while($f = $d->read())
   {
    if ($f == '.' || $f=='..' || $f{0}=='.' || $f=='Zend' || in_array($f, $_GET['exclude']))continue;
    $newdir = rtrim($dir,"/")."/".$f;
    if (is_dir($newdir)){
     $files = array_merge($files,$this->GetFileList($newdir,$newdir));
    }else{
     $abspath_file = (rtrim($dir,"/") ? rtrim($dir,"/")."/" : "").$f;
     $this->fctimes[$abspath_file] = filemtime($abspath_file);
     if (!$this->getFileByFilectime($abspath_file))continue;
     $file = (rtrim($pathP,"/") ? rtrim($pathP,"/")."/" : "").$f;
     $files[] = $file;
    }
   }
  }
  return $files;
 }
}
/**
 * 仿写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;
 /**
  * 构造函数
  *
  * @param  array  配置数组 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...);
  */
 public function __construct($config = array()) {
  if(count($config) > 0) {
   $this->_init($config);
  }
 }
 /**
  * FTP连接
  *
  * @access public
  * @param  array  配置数组
  * @return boolean
  */
 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;
 }
 /**
  * 文件夹是否存在
  * @param unknown_type $path
  */
 public function is_dir_exists($path)
 {
  return $this->chgdir($path);
 }
 /**
  * 目录改变
  *
  * @access public
  * @param  string 目录标识(ftp)
  * @param  boolean 
  * @return boolean
  */
 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)
  * @param  int  文件权限列表 
  * @return boolean
  */
 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 本地目录标识
  * @param  string 远程目录标识(ftp)
  * @param  string 上传模式 auto || ascii
  * @param  int  上传后的文件权限列表 
  * @return boolean
  */
 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, $remotepath, $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)
  * @param  string 本地目录标识
  * @param  string 下载模式 auto || ascii 
  * @return boolean
  */
 public function download($remotepath, $localpath, $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, $localpath, $remotepath, $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)
  * @param  string 新目录标识
  * @param  boolean 判断是重命名(FALSE)还是移动(TRUE) 
  * @return boolean
  */
 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)
  * @return boolean
  */
 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)
  * @return boolean
  */
 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)
  * @return boolean
  */
 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)
  * @return array
  */
 public function filelist($path = '.') {
  if( ! $this->_isconn()) {
   return FALSE;
  }
  return ftp_nlist($this->conn_id, $path);
 }
 /**
  * 关闭FTP
  *
  * @access public
  * @return boolean
  */
 public function close() {
  if( ! $this->_isconn()) {
   return FALSE;
  }
  return @ftp_close($this->conn_id);
 }
 /**
  * FTP成员变量初始化
  *
  * @access private
  * @param  array  配置数组  
  * @return void
  */
 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
  * @return boolean
  */
 private function _login() {
  return @ftp_login($this->conn_id, $this->username, $this->password);
 }
 /**
  * 判断con_id
  *
  * @access private
  * @return boolean
  */
 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 目录标识
  * @return string
  */
 private function _getext($filename) {
  if(FALSE === strpos($filename, '.')) {
   return 'txt';
  }
  $extarr = explode('.', $filename);
  return end($extarr);
 }
 /**
  * 从后缀扩展定义FTP传输模式 ascii 或 binary
  *
  * @access private
  * @param  string 后缀扩展
  * @return string
  */
 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
  * @return boolean
  */
 private function _error($msg) {
  return @file_put_contents('/tmp/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*/

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
经典的PHPer为什么被认为是草根?
Apr 02 PHP
php时间不正确的解决方法
Apr 09 PHP
php使用websocket示例详解
Mar 12 PHP
PHP错误处理函数
Apr 03 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
May 30 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP分享图片的生成方法
Apr 25 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 PHP
php结合正则获取字符串中数字
Jun 19 #PHP
php中文验证码实现方法
Jun 18 #PHP
php实现比较两个文件夹异同的方法
Jun 18 #PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 #PHP
php实现转换ubb代码的方法
Jun 18 #PHP
php实现的日历程序
Jun 18 #PHP
php实现的验证码文件类实例
Jun 18 #PHP
You might like
如何在PHP程序中防止盗链
2008/04/09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
js模糊查询实例分享
2016/12/26 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
python 消费 kafka 数据教程
2019/12/21 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
帕克纽约:PARKER NY
2018/12/09 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
银行实习自我鉴定
2013/10/12 职场文书
小学科学教学反思
2014/01/26 职场文书
大学军训感言300字
2014/03/09 职场文书
七夕情人节促销方案
2014/06/07 职场文书
学校工作推荐信范文
2014/07/11 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
ubuntu下常用apt命令介绍
2022/06/05 Servers