0

0

PHP利用ftp_connect函数实现文件上传下载功能

墨辰丷

墨辰丷

发布时间:2018-06-09 15:29:08

|

2320人浏览过

|

来源于php中文网

原创

本篇文章主要介绍php利用ftp_connect函数实现文件上传下载功能,感兴趣的朋友参考下,希望对大家有所帮助。

大概原理

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

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

具体代码如下:

立即学习PHP免费学习笔记(深入)”;

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

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

下载
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,"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,"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基于采集类Snoopy实现抓取迅雷VIP账号的方法

php实现多维数组的遍历及unset删除的方法

php数字及数字运算验证码

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号