多服务器数据同步并且实时数据处理功能想了很多没找到合适的工具了,今天想了可以使用ftp+rsync工具来实现,下文重点介绍的是php ftp上传类的实现了。

现在很多地方需要用ftp类操作另外的网站服务器,上传图片之类的。现在贴一个php ftp类给大家

class Ftp {

//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)) {

$this->err_code = 1;

return false;

}

}

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

if ($pasv)

ftp_pasv($this->link, true);

$this->link_time = time() - $start;

return true;

} else {

$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) {

if (!$this->link) {

$this->err_code = 2;

return false;

}

$dirname = pathinfo($remote, PATHINFO_DIRNAME);

if (!$this->chdir($dirname)) {

$this->mkdir($dirname);

}

if (@ftp_put($this->link, $remote, $local, $this->mode)) {

return true;

} else {

$this->err_code = 7;

return false;

}

}

/**

* 删除文件夹

* @param string $dirname 目录地址

* @param boolean $enforce 强制删除

*/

public function rmdir($dirname, $enforce = false) {

if (!$this->link) {

$this->err_code = 2;

return 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;

return false;

}

@ftp_rmdir($this->link, $dirname);

return true;

}

/**

* 删除指定文件

* @param string $filename 文件名

*/

public function f_delete($filename) {

if (!$this->link) {

$this->err_code = 2;

return false;

}

if (@ftp_delete($this->link, $filename)) {

return true;

} else {

$this->err_code = 4;

return false;

}

}

/**

* 返回给定目录的文件列表

* @param string $dirname 目录地址

* @return array 文件列表数据

*/

public function nlist($dirname) {

if (!$this->link) {

$this->err_code = 2;

return false;

}

if ($list = @ftp_nlist($this->link, $dirname)) {

return $list;

} else {

$this->err_code = 5;

return false;

}

}

/**

* 在 FTP 服务器上改变当前目录

* @param string $dirname 修改服务器上当前目录

*/

public function chdir($dirname) {

if (!$this->link) {

$this->err_code = 2;

return false;

}

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

return true;

} else {

$this->err_code = 6;

return false;

}

}

/**

* 获取错误信息

*/

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);

}

}

先来说说远程附件上传的大致流程:

用户选择文件上传提交到服务器->服务器接收到文件->服务器一些安全检测完成通过FTP功能上传到相应FTP服务器。

我说的只是一个大概过程,不是很标准,明白个意思即可啦!~

这个类大致使用方法:

首先通过 $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()获取错误信息

rsync工具同步

这里只介绍原理了rsync同步在windows中只能使用windows计划任务来实现了,我们可以定义为1小时同步一次,这样可以保证同步失败文件再次同步一下,当然在ftp上传类时可以做一个错误日志记录,上传失败之后记录在一个日志文件,然后我们可以手工点击再实现一次上传了,这样台保证万无一失了。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php远程上传实例,PHP ftp类实现远程附件上传例子相关推荐

  1. java上传文件限制大小_Java Web:附件上传,两种文件上传限制格式及大小方法,学习笔记文件操作【诗书画唱】...

    附件上传: package com.jy.controller; import java.io.File; import java.io.FileOutputStream; import java.i ...

  2. php单文件上传实例,php封装的单文件(图片)上传类完整实例

    本文实例讲述了php封装的单文件(图片)上传类.分享给大家供大家参考,具体如下: //封装php中的单文件(图片)上传类 /* //参数1:$file 文件数组 5个属性值 name,type,siz ...

  3. 上传手机文件ftp服务器,从android手机上传文件到FTP服务器?

    您可以使用Simple Java FTP Client,并将其添加为您的项目外部JAR,您也可以参考这个link public class FileUpload { /** * Upload a fi ...

  4. oss上传报错_layui+oss阿里云附件上传回调报错问题

    新的广告系统, 采用客户端直接上传到阿里云,阿里云异步调用服务器的模式(Browser.js) 参考地址:https://www.alibabacloud.com/help/zh/doc-detail ...

  5. 一个java小程序运行结果图_编写以下程序,并上传源代码和运行结果截图,附件中上传java源程序。...

    [填空题]向慈善组织捐款 [简答题]你的组员.岗位.团队名.口号是什么? [单选题]被称为"生命中枢"的脑组织是( ). [单选题]已知偶函数 的图象经过 ,则函数的图象必经过另一 ...

  6. 服务器apache远程命令,Linux实例:用socket通讯远程执行命令

    以下为引用的内容: 服务器端程序: /********************************************************** * server.c * 服务器端程序 * ...

  7. shell上传文件到服务器,shell脚本上传文件到ftp服务器

    shell脚本上传文件到ftp服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...

  8. odoo14 ir.attachment附件上传与附件预览功能

    一.附件上传 这里收集了三种附件上传方式: 1.odoo自带附件上传 安装odoo自带的附件列出及文档模块 这样在编辑界面就可以看到附件上传按钮了(odoo14自己测试没成功,暂时不知道原因) 2. ...

  9. 闲人闲谈PS之二十一——SAP自定义程序增加附件上传下载功能

    惯例闲话:国庆假期后,状态不佳,闲人找回状态的方法,对电脑翻箱倒柜,整理文件,往往在整理鸡零狗碎时,会有一些新收获,这倒成了自我调整的一套规律- 这次整理捣鼓,还真是发现了一个解决长久以来SAP被人吐 ...

  10. 山东大学项目实训(十七)—— 微信小程序附件上传、下载、预览、删除

    目录 附件相关功能再实现 附件业务功能介绍 设计步骤 我的上报查看事件详情 (补充) 附件相关功能再实现 下图为笔者之前所写的博客关于实现的附件上传,但是没有下载.预览和删除.正因为没有下载.预览和删 ...

最新文章

  1. 记一次信息泄露(被美团泄露出去的)和被诈骗经历
  2. 问题-[ACCESS2007]怎么显示MsysObjects
  3. mysql中的表连接知识点_Mysql知识点总结
  4. Mysql内连接_INNER JOIN
  5. OpenCV中高斯混合背景建模算法汇总
  6. ABAP程序发送邮件
  7. asp.net ajax中文乱码的解决?2010-01-19 12:06
  8. mysql map 键值对获取_mysql map_get function,用于解析map结构数据,根据key返回相对应value...
  9. python构建二叉树_BinaryTree:学习二叉树的Python库
  10. erlang下lists模块sort(排序)方法源码解析(二)
  11. IDEA连接Git后类的颜色含义
  12. 元气森林海外负责人柳甄离职:是柳传志侄女 柳青堂姐妹
  13. 快圣诞节了,用Python 送你一棵圣诞树
  14. LPC1768 关于延时Delay时间与不同等级的优化对比
  15. 计科之路--linux学习
  16. C# SmartThreadPool线程池技术实现多任务批量处理
  17. 专用舆情监测服务公司,TOOM舆情监测公司排名全国
  18. 逃离云端“母体”——虚拟机逃逸
  19. CAD中如何移动一点至一个绝对坐标
  20. Linux配置本机ssh免登陆(解决启动hadoop3.0时报 Permission denied (publickey,password). 错误)

热门文章

  1. springboot和springframework以及jdk版本的对应关系
  2. NoUniqueBeanDefinitionException: No qualifying bean of type ‘XXXX‘ available: expected single matchi
  3. java多线程在单例模式下是否需要同步
  4. Word2007中公式和文字混排,文字和公式总是没法对齐
  5. 非零基础入门微信小程序
  6. 团队项目第一阶段站立会议01
  7. CentOS修改时区
  8. JavaScript网页开发--三.CSS(级联样式表)
  9. window.print()
  10. SRv6技术课堂:SRv6可靠性方案(一)