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

在php中我们可以利用ftp_connect相关函数实现文件上传与下载功能,其实就是ftp客户端一样的操作,下面我来给大家介绍如何利用php来实现

大概原理

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

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

具体代码如下:

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

  1. <?php 
  2. error_reporting(7); 
  3. if ($_SERVER['SERVER_ADDR'])exit;//禁止在web服务器下运行 
  4. $_GET['exclude'] = array('number.txt','uploads','Zend','docs','cache','You','managesdk'); //排除上传目录,定义为全局变量 
  5. $fileobj = new FilerFile(); 
  6. $path = "/data/longtu/"//项目目录的根目录 
  7. $files = $fileobj->Zip($path); //过滤出最新的修改文件 
  8. $path = str_replace("/data/longtu/","",$path); 
  9. $config = array
  10.   'hostname' => 'xxx.xxx.xx.xxx'//ftp服务器 地址 
  11.   'username' => 'xxx',     //ftp用户 
  12.   'password' => '?xxxxxxxxxxx'//ftp密码 
  13.   'port' => 21         //端口 
  14. ); 
  15. $ftp = new Ftp(); 
  16. $ftp->connect($config);       //链接服务器 
  17. //$a=$ftp->filelist(); 
  18. $LOCAL_ROOT = realpath(dirname(__DIR__)."/../../"); 
  19. chdir($LOCAL_ROOT); 
  20. foreach ($files as $k=>$v){ 
  21.   $f = $path.$v
  22.   $tmp = $ftp->upload($f$f); 
  23.   if($tmp){ 
  24.   echo "upload $f -> success \n"
  25.   } 
  26. //$ftp->download('ftp_upload.log','ftp_download.log'); 
  27. // 
  28. //$ftp->upload('ftp_err.log','ftp_upload.log'); 
  29. //$ftp->download('ftp_upload.log','ftp_download.log'); 
  30. /* 
  31.  * 
  32.  * 
  33.  * $dir = "/test"; 
  34.  if(@ftp_chdir($conn, $dir)) 
  35.   判断是否为文件夹 
  36.  * Enter description here ... 
  37.  * @author Administrator 
  38.  * 
  39.  */ 
  40. class FilerFile 
  41.  var $time_path
  42.  private $fctimes = array(); 
  43.  function Zip($dir
  44.  { 
  45.   $this->time_path = rtrim($dir,"/")."/.~~~time.php"
  46.   //@unlink($this->time_path); 
  47.   $filelist = $this -> GetFileList($dir); 
  48.   file_put_contents($this->time_path,"<?php \n return ".var_export($this->fctimes,true).";"); 
  49.   return $filelist
  50.  } 
  51.  function appendFilectime($file
  52.  { 
  53.   $time_file_path = $this->time_path; 
  54.   $ftime = @include($time_file_path); 
  55.   $ftime = $ftime ? $ftime : array(); 
  56.   $time = filectime($file); 
  57.   if(!file_exists($time_file_path))file_put_contents($time_file_path,"<?php \n"); 
  58.  } 
  59.  function getFileByFilectime($file
  60.  { 
  61.   static $time_data ; 
  62.   $time_file_path = $this->time_path; 
  63.   if (!$time_data){ 
  64.    $time_data= @include_once($time_file_path); 
  65.   } 
  66.   $time_data = $time_data ? $time_data : array(); 
  67.   //var_dump($file,$time_data[$file] == filectime($file)); 
  68.   //echo $file."\t".$time_data[$file]."\n"; 
  69.   if ($time_data[$file] == filemtime($file)){ 
  70.    return false; 
  71.   }else
  72.    return $file
  73.   } 
  74.  } 
  75.  function GetFileList($dir,$path=""
  76.  { 
  77.   static $tmpp = ""
  78.   if ($path=="" && !$tmpp){ 
  79.    $tmpp = $dir
  80.   } 
  81.   $d = dir($dir); 
  82.   $files = array(); 
  83.   if ($d
  84.   { 
  85.    $pathP=str_replace($tmpp,"",$dir); 
  86.    $pathP=str_replace(array("\\\\","/"),DIRECTORY_SEPARATOR,$pathP); 
  87.    $pathP=str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR,DIRECTORY_SEPARATOR,$pathP); 
  88.    while($f = $d->read()) 
  89.    { 
  90.     if ($f == '.' || $f=='..' || $f{0}=='.' || $f=='Zend' || in_array($f$_GET['exclude']))continue
  91.     $newdir = rtrim($dir,"/")."/".$f
  92.     if (is_dir($newdir)){ 
  93.      $files = array_merge($files,$this->GetFileList($newdir,$newdir)); 
  94.     }else
  95.      $abspath_file = (rtrim($dir,"/") ? rtrim($dir,"/")."/" : "").$f
  96.      $this->fctimes[$abspath_file] = filemtime($abspath_file); 
  97.      if (!$this->getFileByFilectime($abspath_file))continue
  98.      $file = (rtrim($pathP,"/") ? rtrim($pathP,"/")."/" : "").$f
  99.      $files[] = $file
  100.     } 
  101.    } 
  102.   } 
  103.   return $files
  104.  } 
  105. /** 
  106.  * 仿写CodeIgniter的FTP类 
  107.  * FTP基本操作: 
  108.  * 1) 登陆;     connect 
  109.  * 2) 当前目录文件列表; filelist 
  110.  * 3) 目录改变;   chgdir 
  111.  * 4) 重命名/移动;   rename 
  112.  * 5) 创建文件夹;    mkdir 
  113.  * 6) 删除;       delete_dir/delete_file 
  114.  * 7) 上传;       upload 
  115.  * 8) 下载        download 
  116.  * 
  117.  * @author quanshuidingdang 
  118.  */ 
  119. class Ftp { 
  120.  private $hostname  = ''
  121.  private $username  = ''
  122.  private $password  = ''
  123.  private $port  = 21; 
  124.  private $passive = TRUE; 
  125.  private $debug   = TRUE; 
  126.  private $conn_id = FALSE; 
  127.  /** 
  128.   * 构造函数 
  129.   * 
  130.   * @param  array  配置数组 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...); 
  131.   */ 
  132.  public function __construct($config = array()) { 
  133.   if(count($config) > 0) { 
  134.    $this->_init($config); 
  135.   } 
  136.  } 
  137.  /** 
  138.   * FTP连接 
  139.   * 
  140.   * @access public 
  141.   * @param  array  配置数组 
  142.   * @return boolean 
  143.   */ 
  144.  public function connect($config = array()) { 
  145.   if(count($config) > 0) { 
  146.    $this->_init($config); 
  147.   } 
  148.   if(FALSE === ($this->conn_id = @ftp_connect($this->hostname,$this->port))) { 
  149.    if($this->debug === TRUE) { 
  150.     $this->_error("ftp_unable_to_connect"); 
  151.    } 
  152.    return FALSE; 
  153.   } 
  154.   if( ! $this->_login()) { 
  155.    if($this->debug === TRUE) { 
  156.     $this->_error("ftp_unable_to_login"); 
  157.    } 
  158.    return FALSE; 
  159.   } 
  160.   if($this->passive === TRUE) { 
  161.    ftp_pasv($this->conn_id, TRUE); 
  162.   } 
  163.   return TRUE; 
  164.  } 
  165.  /** 
  166.   * 文件夹是否存在 
  167.   * @param unknown_type $path 
  168.   */ 
  169.  public function is_dir_exists($path
  170.  { 
  171.   return $this->chgdir($path); 
  172.  } 
  173.  /** 
  174.   * 目录改变 
  175.   * 
  176.   * @access public 
  177.   * @param  string 目录标识(ftp) 
  178.   * @param  boolean  
  179.   * @return boolean 
  180.   */ 
  181.  public function chgdir($path = ''$supress_debug = FALSE) { 
  182.   if($path == '' OR ! $this->_isconn()) { 
  183.    return FALSE; 
  184.   } 
  185.   $result = @ftp_chdir($this->conn_id, $path); 
  186.   if($result === FALSE) { 
  187.    if($this->debug === TRUE AND $supress_debug == FALSE) { 
  188.     $this->_error("ftp_unable_to_chgdir:dir[".$path."]"); 
  189.    } 
  190.    return FALSE; 
  191.   } 
  192.   return TRUE; 
  193.  } 
  194.  /** 
  195.   * 目录生成 
  196.   * 
  197.   * @access public 
  198.   * @param  string 目录标识(ftp) 
  199.   * @param  int  文件权限列表  
  200.   * @return boolean 
  201.   */ 
  202.  public function mkdir($path = ''$permissions = NULL) { 
  203.   if($path == '' OR ! $this->_isconn()) { 
  204.    return FALSE; 
  205.   } 
  206.   $result = @ftp_mkdir($this->conn_id, $path); 
  207.   if($result === FALSE) { 
  208.    if($this->debug === TRUE) { 
  209.     $this->_error("ftp_unable_to_mkdir:dir[".$path."]"); 
  210.    } 
  211.    return FALSE; 
  212.   } 
  213.   if( ! is_null($permissions)) { 
  214.    $this->chmod($path,(int)$permissions); 
  215.   } 
  216.   return TRUE; 
  217.  } 
  218.  /** 
  219.   * 上传 
  220.   * 
  221.   * @access public 
  222.   * @param  string 本地目录标识 
  223.   * @param  string 远程目录标识(ftp) 
  224.   * @param  string 上传模式 auto || ascii 
  225.   * @param  int  上传后的文件权限列表  
  226.   * @return boolean 
  227.   */ 
  228.  public function upload($localpath$remotepath$mode = 'auto'$permissions = NULL) { 
  229.   if( ! $this->_isconn()) { 
  230.    return FALSE; 
  231.   } 
  232.   if( ! file_exists($localpath)) { 
  233.    if($this->debug === TRUE) { 
  234.     $this->_error("ftp_no_source_file:".$localpath); 
  235.    } 
  236.    return FALSE; 
  237.   } 
  238.   if($mode == 'auto') { 
  239.    $ext = $this->_getext($localpath); 
  240.    $mode = $this->_settype($ext); 
  241.   } 
  242.   $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY; 
  243.   $result = @ftp_put($this->conn_id, $remotepath$localpath$mode); 
  244.   if($result === FALSE) { 
  245.    if($this->debug === TRUE) { 
  246.     $this->_error("ftp_unable_to_upload:localpath[".$localpath."]/remotepath[".$remotepath."]"); 
  247.    } 
  248.    return FALSE; 
  249.   } 
  250.   if( ! is_null($permissions)) { 
  251.    $this->chmod($remotepath,(int)$permissions); 
  252.   } 
  253.   return TRUE; 
  254.  } 
  255.  /** 
  256.   * 下载 
  257.   * 
  258.   * @access public 
  259.   * @param  string 远程目录标识(ftp) 
  260.   * @param  string 本地目录标识 
  261.   * @param  string 下载模式 auto || ascii  
  262.   * @return boolean 
  263.   */ 
  264.  public function download($remotepath$localpath$mode = 'auto') { 
  265.   if( ! $this->_isconn()) { 
  266.    return FALSE; 
  267.   } 
  268.   if($mode == 'auto') { 
  269.    $ext = $this->_getext($remotepath); 
  270.    $mode = $this->_settype($ext); 
  271.   } 
  272.   $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY; 
  273.   $result = @ftp_get($this->conn_id, $localpath$remotepath$mode); 
  274.   if($result === FALSE) { 
  275.    if($this->debug === TRUE) { 
  276.     $this->_error("ftp_unable_to_download:localpath[".$localpath."]-remotepath[".$remotepath."]"); 
  277.    } 
  278.    return FALSE; 
  279.   } 
  280.   return TRUE; 
  281.  } 
  282.  /** 
  283.   * 重命名/移动 
  284.   * 
  285.   * @access public 
  286.   * @param  string 远程目录标识(ftp) 
  287.   * @param  string 新目录标识 
  288.   * @param  boolean 判断是重命名(FALSE)还是移动(TRUE)  
  289.   * @return boolean 
  290.   */ 
  291.  public function rename($oldname$newname$move = FALSE) { 
  292.   if( ! $this->_isconn()) { 
  293.    return FALSE; 
  294.   } 
  295.   $result = @ftp_rename($this->conn_id, $oldname$newname); 
  296.   if($result === FALSE) { 
  297.    if($this->debug === TRUE) { 
  298.     $msg = ($move == FALSE) ? "ftp_unable_to_rename" : "ftp_unable_to_move"
  299.     $this->_error($msg); 
  300.    } 
  301.    return FALSE; 
  302.   } 
  303.   return TRUE; 
  304.  } 
  305.  /** 
  306.   * 删除文件 
  307.   * 
  308.   * @access public 
  309.   * @param  string 文件标识(ftp) 
  310.   * @return boolean 
  311.   */ 
  312.  public function delete_file($file) { 
  313.   if( ! $this->_isconn()) { 
  314.    return FALSE; 
  315.   } 
  316.   $result = @ftp_delete($this->conn_id, $file); 
  317.   if($result === FALSE) { 
  318.    if($this->debug === TRUE) { 
  319.     $this->_error("ftp_unable_to_delete_file:file[".$file."]"); 
  320.    } 
  321.    return FALSE; 
  322.   } 
  323.   return TRUE; 
  324.  } 
  325.  /** 
  326.   * 删除文件夹 
  327.   * 
  328.   * @access public 
  329.   * @param  string 目录标识(ftp) 
  330.   * @return boolean 
  331.   */ 
  332.  public function delete_dir($path) { 
  333.   if( ! $this->_isconn()) { 
  334.    return FALSE; 
  335.   } 
  336.   //对目录宏的'/'字符添加反斜杠'\' 
  337.   $path = preg_replace("/(.+?)\/*$/""\\1/"$path); 
  338.   //获取目录文件列表 
  339.   $filelist = $this->filelist($path); 
  340.   if($filelist !== FALSE AND count($filelist) > 0) { 
  341.    foreach($filelist as $item) { 
  342.     //如果我们无法删除,那么就可能是一个文件夹 
  343.     //所以我们递归调用delete_dir() 
  344.     if( ! @delete_file($item)) { 
  345.      $this->delete_dir($item); 
  346.     } 
  347.    } 
  348.   } 
  349.   //删除文件夹(空文件夹) 
  350.   $result = @ftp_rmdir($this->conn_id, $path); 
  351.   if($result === FALSE) { 
  352.    if($this->debug === TRUE) { 
  353.     $this->_error("ftp_unable_to_delete_dir:dir[".$path."]"); 
  354.    } 
  355.    return FALSE; 
  356.   } 
  357.   return TRUE; 
  358.  } 
  359.  /** 
  360.   * 修改文件权限 
  361.   * 
  362.   * @access public 
  363.   * @param  string 目录标识(ftp) 
  364.   * @return boolean 
  365.   */ 
  366.  public function chmod($path$perm) { 
  367.   if( ! $this->_isconn()) { 
  368.    return FALSE; 
  369.   } 
  370.   //只有在PHP5中才定义了修改权限的函数(ftp) 
  371.   if( ! function_exists('ftp_chmod')) { 
  372.    if($this->debug === TRUE) { 
  373.     $this->_error("ftp_unable_to_chmod(function)"); 
  374.    } 
  375.    return FALSE; 
  376.   } 
  377.   $result = @ftp_chmod($this->conn_id, $perm$path); 
  378.   if($result === FALSE) { 
  379.    if($this->debug === TRUE) { 
  380.     $this->_error("ftp_unable_to_chmod:path[".$path."]-chmod[".$perm."]"); 
  381.    } 
  382.    return FALSE; 
  383.   } 
  384.   return TRUE; 
  385.  } 
  386.  /** 
  387.   * 获取目录文件列表 
  388.   * 
  389.   * @access public 
  390.   * @param  string 目录标识(ftp) 
  391.   * @return array 
  392.   */ 
  393.  public function filelist($path = '.') { 
  394.   if( ! $this->_isconn()) { 
  395.    return FALSE; 
  396.   } 
  397.   return ftp_nlist($this->conn_id, $path); 
  398.  } 
  399.  /** 
  400.   * 关闭FTP 
  401.   * 
  402.   * @access public 
  403.   * @return boolean 
  404.   */ 
  405.  public function close() { 
  406.   if( ! $this->_isconn()) { 
  407.    return FALSE; 
  408.   } 
  409.   return @ftp_close($this->conn_id); 
  410.  } 
  411.  /** 
  412.   * FTP成员变量初始化 
  413.   * 
  414.   * @access private 
  415.   * @param  array  配置数组   
  416.   * @return void 
  417.   */ 
  418.  private function _init($config = array()) { 
  419.   foreach($config as $key => $val) { 
  420.    if(isset($this->$key)) { 
  421.     $this->$key = $val
  422.    } 
  423.   } 
  424.   //特殊字符过滤 
  425.   $this->hostname = preg_replace('|.+?://|','',$this->hostname); 
  426.  } 
  427.  /** 
  428.   * FTP登陆 
  429.   * 
  430.   * @access private 
  431.   * @return boolean 
  432.   */ 
  433.  private function _login() { 
  434.   return @ftp_login($this->conn_id, $this->username, $this->password); 
  435.  } 
  436.  /** 
  437.   * 判断con_id 
  438.   * 
  439.   * @access private 
  440.   * @return boolean 
  441.   */ 
  442.  private function _isconn() { 
  443.   if( ! is_resource($this->conn_id)) { 
  444.    if($this->debug === TRUE) { 
  445.     $this->_error("ftp_no_connection"); 
  446.    } 
  447.    return FALSE; 
  448.   } 
  449.   return TRUE; 
  450.  } 
  451.  /** 
  452.   * 从文件名中获取后缀扩展 
  453.   * 
  454.   * @access private 
  455.   * @param  string 目录标识 
  456.   * @return string 
  457.   */ 
  458.  private function _getext($filename) { 
  459.   if(FALSE === strpos($filename'.')) { 
  460.    return 'txt'
  461.   } 
  462.   $extarr = explode('.'$filename); 
  463.   return end($extarr); 
  464.  } 
  465.  /** 
  466.   * 从后缀扩展定义FTP传输模式 ascii 或 binary 
  467.   * 
  468.   * @access private 
  469.   * @param  string 后缀扩展 
  470.   * @return string 
  471.   */ 
  472.  private function _settype($ext) { 
  473.   $text_type = array ( 
  474.        'txt'
  475.        'text'
  476.        'php'
  477.        'phps'
  478.        'php4'
  479.        'js'
  480.        'css'
  481.        'htm'
  482.        'html'
  483.        'phtml'
  484.        'shtml'
  485.        'log'
  486.        'xml' 
  487.        ); 
  488.   return (in_array($ext$text_type)) ? 'ascii' : 'binary'
  489.  } 
  490.  /** 
  491.   * 错误日志记录 
  492.   * 
  493.   * @access prvate 
  494.   * @return boolean 
  495.   */ 
  496.  private function _error($msg) { 
  497.   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); 
  498.  } 
  499. /*End of file ftp.php*/ 
  500. /*Location /Apache Group/htdocs/ftp.php*/ 

以上所述就是本文的全部内容了,希望大家能够喜欢。

 


出处:http://www.phpfensi.com/php/20210528/16035.html
 


相关教程