當前位置:首頁 > PHP教程 > php上傳下載 > 列表

PHP ftp類實現遠程附件上傳例子

發布:smiling 來源: PHP粉絲網  添加日期:2015-04-08 15:11:45 瀏覽: 評論:0 

多服務器數據同步并且實時數據處理功能想了很多沒找到合適的工具了,今天想了可以使用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上傳類時可以做一個錯誤日志記錄,上傳失敗之后記錄在一個日志文件,然后我們可以手工點擊再實現一次上傳了,這樣臺保證萬無一失了.

Tags: PHP ftp類 php遠程附件

分享到:

福利彩票25选5开奖结果