VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • PHP ftp类实现远程附件上传例子

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

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

  1. class Ftp { 
  2.          
  3.     //FTP 连接资源 
  4.     private $link
  5.     //FTP连接时间 
  6.     public $link_time
  7.     //错误代码 
  8.     private $err_code = 0; 
  9.     //传送模式{文本模式:FTP_ASCII, 二进制模式:FTP_BINARY} 
  10.     public $mode = FTP_BINARY; 
  11.          
  12.     /** 
  13.      * 连接FTP服务器 
  14.      * @param string $host       服务器地址 
  15.      * @param string $username   用户名 
  16.      * @param string $password   密码 
  17.      * @param integer $port       服务器端口,默认值为21 
  18.      * @param boolean $pasv        是否开启被动模式 
  19.      * @param boolean $ssl      是否使用SSL连接 
  20.      * @param integer $timeout     超时时间  
  21.      */ 
  22.     public function connect($host$username = ''$password = ''$port = '21'$pasv = false, $ssl = false, $timeout = 30) { 
  23.         $start = time(); 
  24.         if ($ssl) { 
  25.             if (!$this->link = @ftp_ssl_connect($host$port$timeout))     { 
  26.                 $this->err_code = 1; 
  27.                 return false; 
  28.             } 
  29.         } else { 
  30.             if (!$this->link = @ftp_connect($host$port$timeout)) { 
  31.                 $this->err_code = 1; 
  32.                 return false; 
  33.             } 
  34.         } 
  35.          
  36.         if (@ftp_login($this->link, $username$password)) { 
  37.             if ($pasv
  38.                 ftp_pasv($this->link, true); 
  39.             $this->link_time = time() - $start
  40.             return true; 
  41.         } else { 
  42.             $this->err_code = 1; 
  43.             return false; 
  44.         } 
  45.         register_shutdown_function(array(&$this'close')); 
  46.     } 
  47.          
  48.     /** 
  49.      * 创建文件夹 
  50.      * @param string $dirname 目录名, 
  51.      */ 
  52.     public function mkdir($dirname) { 
  53.         if (!$this->link) { 
  54.             $this->err_code = 2; 
  55.             return false; 
  56.         } 
  57.         $dirname = $this->ck_dirname($dirname); 
  58.         $nowdir = '/'
  59.         foreach ($dirname as $v) { 
  60.             if ($v && !$this->chdir($nowdir . $v)) { 
  61.                 if ($nowdir
  62.                     $this->chdir($nowdir); 
  63.                 @ftp_mkdir($this->link, $v); 
  64.             } 
  65.             if ($v
  66.                 $nowdir .= $v . '/'
  67.         } 
  68.         return true; 
  69.     } 
  70.          
  71.     /** 
  72.      * 上传文件 
  73.      * @param string $remote 远程存放地址 
  74.      * @param string $local 本地存放地址 
  75.      */ 
  76.     public function put($remote$local) { 
  77.         if (!$this->link) { 
  78.             $this->err_code = 2; 
  79.             return false; 
  80.         } 
  81.         $dirname = pathinfo($remote, PATHINFO_DIRNAME); 
  82.         if (!$this->chdir($dirname)) { 
  83.             $this->mkdir($dirname); 
  84.         } 
  85.         if (@ftp_put($this->link, $remote$local$this->mode)) { 
  86.             return true; 
  87.         } else { 
  88.             $this->err_code = 7; 
  89.             return false; 
  90.         } 
  91.     } 
  92.          
  93.     /** 
  94.      * 删除文件夹 
  95.      * @param string $dirname  目录地址 
  96.      * @param boolean $enforce 强制删除 
  97.      */ 
  98.     public function rmdir($dirname$enforce = false) { 
  99.         if (!$this->link) { 
  100.             $this->err_code = 2; 
  101.             return false; 
  102.         } 
  103.         $list = $this->nlist($dirname); 
  104.         if ($list && $enforce) { 
  105.             $this->chdir($dirname); 
  106.             foreach ($list as $v) { 
  107.                 $this->f_delete($v); 
  108.             } 
  109.         } elseif ($list && !$enforce) { 
  110.             $this->err_code = 3; 
  111.             return false; 
  112.         } 
  113.         @ftp_rmdir($this->link, $dirname); 
  114.         return true; 
  115.     } 
  116.          
  117.     /** 
  118.      * 删除指定文件 
  119.      * @param string $filename 文件名 
  120.      */ 
  121.     public function f_delete($filename) { 
  122.         if (!$this->link) { 
  123.             $this->err_code = 2; 
  124.             return false; 
  125.         } 
  126.         if (@ftp_delete($this->link, $filename)) { 
  127.             return true; 
  128.         } else { 
  129.             $this->err_code = 4; 
  130.             return false; 
  131.         } 
  132.     } 
  133.          
  134.     /** 
  135.      * 返回给定目录的文件列表 
  136.      * @param string $dirname  目录地址 
  137.      * @return array 文件列表数据 
  138.      */ 
  139.     public function nlist($dirname) { 
  140.         if (!$this->link) { 
  141.             $this->err_code = 2; 
  142.             return false; 
  143.         } //开源软件:phpfensi.com 
  144.         if ($list = @ftp_nlist($this->link, $dirname)) { 
  145.             return $list
  146.         } else { 
  147.             $this->err_code = 5; 
  148.             return false; 
  149.         } 
  150.     } 
  151.          
  152.     /** 
  153.      * 在 FTP 服务器上改变当前目录 
  154.      * @param string $dirname 修改服务器上当前目录 
  155.      */ 
  156.     public function chdir($dirname) { 
  157.         if (!$this->link) { 
  158.             $this->err_code = 2; 
  159.             return false; 
  160.         } 
  161.         if (@ftp_chdir($this->link, $dirname)) { 
  162.             return true; 
  163.         } else { 
  164.             $this->err_code = 6; 
  165.             return false; 
  166.         } 
  167.     } 
  168.          
  169.     /** 
  170.      * 获取错误信息 
  171.      */ 
  172.     public function get_error() { 
  173.         if (!$this->err_code) 
  174.             return false; 
  175.         $err_msg = array
  176.             '1' => 'Server can not connect'
  177.             '2' => 'Not connect to server'
  178.             '3' => 'Can not delete non-empty folder'
  179.             '4' => 'Can not delete file'
  180.             '5' => 'Can not get file list'
  181.             '6' => 'Can not change the current directory on the server'
  182.             '7' => 'Can not upload files' 
  183.         ); 
  184.         return $err_msg[$this->err_code]; 
  185.     } 
  186.          
  187.     /** 
  188.      * 检测目录名 
  189.      * @param string $url 目录 
  190.      * @return 由 / 分开的返回数组 
  191.      */ 
  192.     private function ck_dirname($url) { 
  193.         $url = str_replace('''/'$url); 
  194.         $urls = explode('/'$url); 
  195.         return $urls
  196.     } 
  197.          
  198.     /** 
  199.      * 关闭FTP连接 
  200.      */ 
  201.     public function close() { 
  202.         return @ftp_close($this->link); 
  203.     } 
  204.          

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

用户选择文件上传提交到服务器->服务器接收到文件->服务器一些安全检测完成通过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上传类时可以做一个错误日志记录,上传失败之后记录在一个日志文件,然后我们可以手工点击再实现一次上传了,这样台保证万无一失了.

 

出处:http://www.phpfensi.com/php/20150408/9063.html


相关教程