一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

深入PHP FTP類的詳解

FTP是一種文件傳輸協(xié)議,它支持兩種模式,一種方式叫做Standard (也就是Active,主動(dòng)方式),一種是 Passive (也就是PASV,被動(dòng)方式)。 Standard模式 FTP 的客戶端發(fā)送 PORT 命令到FTP server。Passive模式FTP的客戶端發(fā)送 PASV命令到 FTP Server。
下面介紹一個(gè)這兩種方式的工作原理:

Standard模式
FTP 客戶端首先和FTP Server的TCP 21端口建立連接,通過這個(gè)通道 發(fā)送命令,客戶端需要接收數(shù)據(jù)的時(shí)候在這個(gè)通道上發(fā)送PORT命令。 PORT命令包含 了客戶端用什么端口接收數(shù)據(jù)。在傳送數(shù)據(jù)的時(shí)候,服務(wù)器端通過自己的TCP 20端口發(fā)送數(shù)據(jù)。 FTP server必須和客戶端建立一個(gè)新的連接用來傳送數(shù)據(jù)。

Passive模式
在建立控制通道的時(shí)候和Standard模式類似,當(dāng)客戶端通過這個(gè)通道發(fā)送PASV 命令的時(shí)候,F(xiàn)TP server打開一個(gè)位于1024和5000之間的隨機(jī)端口并且通知 客戶端在這個(gè)端口上傳送數(shù)據(jù)的請(qǐng)求,然后FTP server 將通過這個(gè)端口進(jìn)行數(shù)據(jù)的傳送,這個(gè)時(shí)候FTP server不再需要建立一個(gè)新的和客戶端之間的連接。
使用php操作FTP-用法
復(fù)制代碼 代碼如下:
<? 
    // 聯(lián)接FTP服務(wù)器 
    $conn = ftp_connect(ftp.server.com); 

    // 使用username和password登錄 
    ftp_login($conn, “john”, “doe”); 

    // 獲取遠(yuǎn)端系統(tǒng)類型 
    ftp_systype($conn); 

    // 列示文件 
    $filelist = ftp_nlist($conn, “.”); 

    // 下載文件 
    ftp_get($conn, “data.zip”, “data.zip”, FTP_BINARY); 

    // 關(guān)閉聯(lián)接 
    ftp_quit($conn); 

    //初結(jié)化一個(gè)FTP聯(lián)接,php提供了ftp_connect()這個(gè)函數(shù),它使用主機(jī)名稱和端口作為參數(shù)。在上面的例子里,主機(jī)名字為 “ftp.server.com”;如果端口沒指定,php將會(huì)使用“21”作為缺省端口來建立聯(lián)接。 

    //聯(lián)接成功后ftp_connect()傳回一個(gè)handle句柄;這個(gè)handle將被以后使用的FTP函數(shù)使用。 
    $conn = ftp_connect(ftp.server.com); 

    //一旦建立聯(lián)接,使用ftp_login()發(fā)送一個(gè)用戶名稱和用戶密碼。你可以看到,這個(gè)函數(shù)ftp_login()使用了 ftp_connect()函數(shù)傳來的handle,以確定用戶名和密碼能被提交到正確的服務(wù)器。 
    ftp_login($conn, “john”, “doe”); 

    // close connection 
    ftp_quit($conn); 

    //登錄了FTP服務(wù)器php提供了一些函數(shù),它們能獲取一些關(guān)于系統(tǒng)和文件以及目錄的信息。 
    ftp_pwd() 

    //獲取當(dāng)前所在的目錄 
    $here = ftp_pwd($conn); 

    //獲取服務(wù)器端系統(tǒng)信息ftp_systype() 
    $server_os = ftp_systype($conn); 

    //被動(dòng)模式(PASV)的開關(guān),打開或關(guān)閉PASV(1表示開) 
    ftp_pasv($conn, 1); 

    //進(jìn)入目錄中用ftp_chdir()函數(shù),它接受一個(gè)目錄名作為參數(shù)。 
    ftp_chdir($conn, “public_html”); 

    //回到所在的目錄父目錄用ftp_cdup()實(shí)現(xiàn) 
    ftp_cdup($conn); 

    //建立或移動(dòng)一個(gè)目錄,這要使用ftp_mkdir()和ftp_rmdir()函數(shù);注意:ftp_mkdir()建立成功的話,就會(huì)返回新建立的目錄名。 
    ftp_mkdir($conn, “test”); 

    ftp_rmdir($conn, “test”); 

    //上傳文件,ftp_put()函數(shù)能很好的勝任,它需要你指定一個(gè)本地文件名,上傳后的文件名以及傳輸?shù)念愋汀1确秸f:如果你想上傳 “abc.txt”這個(gè)文件,上傳后命名為“xyz.txt”,命令應(yīng)該是這樣: 
    ftp_put($conn, “xyz.txt”, “abc.txt”, FTP_ASCII); 

    //下載文件:php所提供的函數(shù)是ftp_get(),它也需要一個(gè)服務(wù)器上文件名,下載后的文件名,以及傳輸類型作為參數(shù),例如:服務(wù)器端文件為his.zip,你想下載至本地機(jī),并命名為hers.zip,命令如下: 
    ftp_get($conn, “hers.zip”, “his.zip”, FTP_BINARY); 

    //php提供兩種方法:一種是簡(jiǎn)單列示文件名和目錄,另一種就是詳細(xì)的列示文件的大小,權(quán)限,創(chuàng)立時(shí)間等信息。 

    //第一種使用ftp_nlist()函數(shù),第二種用ftp_rawlist().兩種函數(shù)都需要一個(gè)目錄名做為參數(shù),都返回目錄列做為一個(gè)數(shù)組,數(shù)組的每一個(gè)元素相當(dāng)于列表的一行。 
    $filelist = ftp_nlist($conn, “.”); 

    //函數(shù)ftp_size(),它返回你所指定的文件的大小,使用BITES作為單位。要指出的是,如果它返回的是 “-1”的話,意味著這是一個(gè)目錄 
    $filelist = ftp_size($conn, “data.zip”); 

    ?> 

FTP類
復(fù)制代碼 代碼如下:
<?php
/**
 * 仿寫CodeIgniter的FTP類
 * FTP基本操作:
 * 1) 登陸;    connect
 * 2) 當(dāng)前目錄文件列表;  filelist
 * 3) 目錄改變;   chgdir
 * 4) 重命名/移動(dòng);  rename
 * 5) 創(chuàng)建文件夾;  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;

 /**
  * 構(gòu)造函數(shù)
  *
  * @param array 配置數(shù)組 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...);
  */
 public function __construct($config = array()) {
  if(count($config) > 0) {
   $this->_init($config);
  }
 }

 /**
  * FTP連接
  *
  * @access  public
  * @param  array  配置數(shù)組
  * @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;
 }

 /**
  * 目錄改變
  *
  * @access  public
  * @param  string  目錄標(biāo)識(shí)(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  目錄標(biāo)識(shí)(ftp)
  * @param int   文件權(quán)限列表 
  * @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  本地目錄標(biāo)識(shí)
  * @param string 遠(yuǎn)程目錄標(biāo)識(shí)(ftp)
  * @param string 上傳模式 auto || ascii
  * @param int  上傳后的文件權(quán)限列表 
  * @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  遠(yuǎn)程目錄標(biāo)識(shí)(ftp)
  * @param string 本地目錄標(biāo)識(shí)
  * @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;
 }

 /**
  * 重命名/移動(dòng)
  *
  * @access  public
  * @param  string  遠(yuǎn)程目錄標(biāo)識(shí)(ftp)
  * @param string 新目錄標(biāo)識(shí)
  * @param boolean 判斷是重命名(FALSE)還是移動(dòng)(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  文件標(biāo)識(shí)(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  目錄標(biāo)識(shí)(ftp)
  * @return boolean
  */
 public function delete_dir($path) {
  if( ! $this->_isconn()) {
   return FALSE;
  }

  //對(duì)目錄宏的'/'字符添加反斜杠'/'
  $path = preg_replace("/(.+?)//*$/", "http://1/", $path);

  //獲取目錄文件列表
  $filelist = $this->filelist($path);

  if($filelist !== FALSE AND count($filelist) > 0) {
   foreach($filelist as $item) {
    //如果我們無法刪除,那么就可能是一個(gè)文件夾
    //所以我們遞歸調(diào)用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;
 }

 /**
  * 修改文件權(quán)限
  *
  * @access  public
  * @param  string  目錄標(biāo)識(shí)(ftp)
  * @return boolean
  */
 public function chmod($path, $perm) {
  if( ! $this->_isconn()) {
   return FALSE;
  }

  //只有在php5中才定義了修改權(quán)限的函數(shù)(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  目錄標(biāo)識(shí)(ftp)
  * @return array
  */
 public function filelist($path = '.') {
  if( ! $this->_isconn()) {
   return FALSE;
  }

  return ftp_nlist($this->conn_id, $path);
 }

 /**
  * 關(guān)閉FTP
  *
  * @access  public
  * @return boolean
  */
 public function close() {
  if( ! $this->_isconn()) {
   return FALSE;
  }

  return @ftp_close($this->conn_id);
 }

 /**
  * FTP成員變量初始化
  *
  * @access private
  * @param array 配置數(shù)組 
  * @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;
 }

 /**
  * 從文件名中獲取后綴擴(kuò)展
  *
  * @access  private
  * @param  string  目錄標(biāo)識(shí)
  * @return string
  */
 private function _getext($filename) {
  if(FALSE === strpos($filename, '.')) {
   return 'txt';
  }

  $extarr = explode('.', $filename);
  return end($extarr);
 }

 /**
  * 從后綴擴(kuò)展定義FTP傳輸模式  ascii 或 binary
  *
  * @access  private
  * @param  string  后綴擴(kuò)展
  * @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';
 }

 /**
  * 錯(cuò)誤日志記錄
  *
  * @access  prvate
  * @return boolean
  */
 private function _error($msg) {
  return @file_put_contents('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*/

DEMO
復(fù)制代碼 代碼如下:
<?php
require_once('ftp.php');
$config = array(
   'hostname' => 'localhost',
   'username' => 'root',
   'password' => 'root',
   'port' => 21
    );
$ftp = new Ftp();
$ftp->connect($config);
$ftp->upload('ftp_err.log','ftp_upload.log');
$ftp->download('ftp_upload.log','ftp_download.log');
/*End of file ftp_demo.php*/
/*Location: /htdocs/ftp_demo.php*/

php技術(shù)深入PHP FTP類的詳解,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 香蕉久久精品 | 国产高清乱理论片在线看 | 久久精品网| 97久久精品国产精品青草 | 91在线视频精品 | 四虎永久在线精品免费影视 | 国产成人综合亚洲欧洲色就色 | 思思玖玖玖在线精品视频 | 曰本视频网络www色 曰韩美女一级视频 | 免费视频精品 | 国产女人一区二区 | 国产精品视_精品国产免费 国产精品视频1区 | 亚洲看片网站 | 国产精欧美一区二区三区 | 久久久久久久久影院 | 亚洲aaaa级特黄毛片 | 国产精品综合视频 | 色五月天天 | 丁香六月婷婷 | 日本精品久久 | 91精品国产自产91精品 | 欧美一区二区三区性 | 国产福利资源 | 亚洲综合一二三区 | 久国产精品久久精品国产四虎 | 亚洲伦理一区二区三区 | 偷偷狠狠的日日2020 | 亚洲精品欧美综合四区 | 色宅男中文字幕亚洲专区 | 日本高清视频在线 | 久久艹伊人 | 久99视频| 亚洲成在人网站天堂一区二区 | 国产成人精品久久亚洲高清不卡 | 国产精品亚洲一区二区三区正片 | 欧美人禽杂交 | 手机看片自拍自拍自拍 | 亚洲综合图色 | 亚洲福利视频一区二区三区 | 四虎永久在线精品视频免费观看 | 色呦呦网|