php实现通过ftp上传文件
大概原理
遍历项目中的所有非排除文件,然后获取文件修改时间晚于文件上一次修改时间的文件
然后将这些文件,通过ftp上传到对应的目录
具体代码如下:
因为只是工具,代码很乱,见谅
<?php error_reporting(7); if($_SERVER['SERVER_ADDR'])exit;//禁止在web服务器下运行 $_GET['exclude']=array('number.txt','uploads','Zend','docs','cache','You','managesdk');//排除上传目录,定义为全局变量 $fileobj=newFilerFile(); $path="/data/longtu/";//项目目录的根目录 $files=$fileobj->Zip($path);//过滤出最新的修改文件 $path=str_replace("/data/longtu/","",$path); $config=array( 'hostname'=>'xxx.xxx.xx.xxx',//ftp服务器地址 'username'=>'xxx',//ftp用户 'password'=>'?xxxxxxxxxxx',//ftp密码 'port'=>21//端口 ); $ftp=newFtp(); $ftp->connect($config);//链接服务器 //$a=$ftp->filelist(); $LOCAL_ROOT=realpath(dirname(__DIR__)."/../../"); chdir($LOCAL_ROOT); foreach($filesas$k=>$v){ $f=$path.$v; $tmp=$ftp->upload($f,$f); if($tmp){ echo"upload$f->success\n"; } } //$ftp->download('ftp_upload.log','ftp_download.log'); // //$ftp->upload('ftp_err.log','ftp_upload.log'); //$ftp->download('ftp_upload.log','ftp_download.log'); /* * * *$dir="/test"; if(@ftp_chdir($conn,$dir)) 判断是否为文件夹 *Enterdescriptionhere... *@authorAdministrator * */ classFilerFile { var$time_path; private$fctimes=array(); functionZip($dir) { $this->time_path=rtrim($dir,"/")."/.~~~time.php"; //@unlink($this->time_path); $filelist=$this->GetFileList($dir); file_put_contents($this->time_path,"<?php\nreturn".var_export($this->fctimes,true).";"); return$filelist; } functionappendFilectime($file) { $time_file_path=$this->time_path; $ftime=@include($time_file_path); $ftime=$ftime?$ftime:array(); $time=filectime($file); if(!file_exists($time_file_path))file_put_contents($time_file_path,"<?php\n"); } functiongetFileByFilectime($file) { static$time_data; $time_file_path=$this->time_path; if(!$time_data){ $time_data=@include_once($time_file_path); } $time_data=$time_data?$time_data:array(); //var_dump($file,$time_data[$file]==filectime($file)); //echo$file."\t".$time_data[$file]."\n"; if($time_data[$file]==filemtime($file)){ returnfalse; }else{ return$file; } } functionGetFileList($dir,$path="") { static$tmpp=""; if($path==""&&!$tmpp){ $tmpp=$dir; } $d=dir($dir); $files=array(); if($d) { $pathP=str_replace($tmpp,"",$dir); $pathP=str_replace(array("\\\\","/"),DIRECTORY_SEPARATOR,$pathP); $pathP=str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR,DIRECTORY_SEPARATOR,$pathP); while($f=$d->read()) { if($f=='.'||$f=='..'||$f{0}=='.'||$f=='Zend'||in_array($f,$_GET['exclude']))continue; $newdir=rtrim($dir,"/")."/".$f; if(is_dir($newdir)){ $files=array_merge($files,$this->GetFileList($newdir,$newdir)); }else{ $abspath_file=(rtrim($dir,"/")?rtrim($dir,"/")."/":"").$f; $this->fctimes[$abspath_file]=filemtime($abspath_file); if(!$this->getFileByFilectime($abspath_file))continue; $file=(rtrim($pathP,"/")?rtrim($pathP,"/")."/":"").$f; $files[]=$file; } } } return$files; } } /** *仿写CodeIgniter的FTP类 *FTP基本操作: *1)登陆;connect *2)当前目录文件列表;filelist *3)目录改变;chgdir *4)重命名/移动;rename *5)创建文件夹;mkdir *6)删除;delete_dir/delete_file *7)上传;upload *8)下载download * *@authorquanshuidingdang */ classFtp{ private$hostname=''; private$username=''; private$password=''; private$port=21; private$passive=TRUE; private$debug=TRUE; private$conn_id=FALSE; /** *构造函数 * *@paramarray配置数组:$config=array('hostname'=>'','username'=>'','password'=>'','port'=>''...); */ publicfunction__construct($config=array()){ if(count($config)>0){ $this->_init($config); } } /** *FTP连接 * *@accesspublic *@paramarray配置数组 *@returnboolean */ publicfunctionconnect($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"); } returnFALSE; } if(!$this->_login()){ if($this->debug===TRUE){ $this->_error("ftp_unable_to_login"); } returnFALSE; } if($this->passive===TRUE){ ftp_pasv($this->conn_id,TRUE); } returnTRUE; } /** *文件夹是否存在 *@paramunknown_type$path */ publicfunctionis_dir_exists($path) { return$this->chgdir($path); } /** *目录改变 * *@accesspublic *@paramstring目录标识(ftp) *@paramboolean *@returnboolean */ publicfunctionchgdir($path='',$supress_debug=FALSE){ if($path==''OR!$this->_isconn()){ returnFALSE; } $result=@ftp_chdir($this->conn_id,$path); if($result===FALSE){ if($this->debug===TRUEAND$supress_debug==FALSE){ $this->_error("ftp_unable_to_chgdir:dir[".$path."]"); } returnFALSE; } returnTRUE; } /** *目录生成 * *@accesspublic *@paramstring目录标识(ftp) *@paramint文件权限列表 *@returnboolean */ publicfunctionmkdir($path='',$permissions=NULL){ if($path==''OR!$this->_isconn()){ returnFALSE; } $result=@ftp_mkdir($this->conn_id,$path); if($result===FALSE){ if($this->debug===TRUE){ $this->_error("ftp_unable_to_mkdir:dir[".$path."]"); } returnFALSE; } if(!is_null($permissions)){ $this->chmod($path,(int)$permissions); } returnTRUE; } /** *上传 * *@accesspublic *@paramstring本地目录标识 *@paramstring远程目录标识(ftp) *@paramstring上传模式auto||ascii *@paramint上传后的文件权限列表 *@returnboolean */ publicfunctionupload($localpath,$remotepath,$mode='auto',$permissions=NULL){ if(!$this->_isconn()){ returnFALSE; } if(!file_exists($localpath)){ if($this->debug===TRUE){ $this->_error("ftp_no_source_file:".$localpath); } returnFALSE; } 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."]"); } returnFALSE; } if(!is_null($permissions)){ $this->chmod($remotepath,(int)$permissions); } returnTRUE; } /** *下载 * *@accesspublic *@paramstring远程目录标识(ftp) *@paramstring本地目录标识 *@paramstring下载模式auto||ascii *@returnboolean */ publicfunctiondownload($remotepath,$localpath,$mode='auto'){ if(!$this->_isconn()){ returnFALSE; } 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."]"); } returnFALSE; } returnTRUE; } /** *重命名/移动 * *@accesspublic *@paramstring远程目录标识(ftp) *@paramstring新目录标识 *@paramboolean判断是重命名(FALSE)还是移动(TRUE) *@returnboolean */ publicfunctionrename($oldname,$newname,$move=FALSE){ if(!$this->_isconn()){ returnFALSE; } $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); } returnFALSE; } returnTRUE; } /** *删除文件 * *@accesspublic *@paramstring文件标识(ftp) *@returnboolean */ publicfunctiondelete_file($file){ if(!$this->_isconn()){ returnFALSE; } $result=@ftp_delete($this->conn_id,$file); if($result===FALSE){ if($this->debug===TRUE){ $this->_error("ftp_unable_to_delete_file:file[".$file."]"); } returnFALSE; } returnTRUE; } /** *删除文件夹 * *@accesspublic *@paramstring目录标识(ftp) *@returnboolean */ publicfunctiondelete_dir($path){ if(!$this->_isconn()){ returnFALSE; } //对目录宏的'/'字符添加反斜杠'\' $path=preg_replace("/(.+?)\/*$/","\\1/",$path); //获取目录文件列表 $filelist=$this->filelist($path); if($filelist!==FALSEANDcount($filelist)>0){ foreach($filelistas$item){ //如果我们无法删除,那么就可能是一个文件夹 //所以我们递归调用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."]"); } returnFALSE; } returnTRUE; } /** *修改文件权限 * *@accesspublic *@paramstring目录标识(ftp) *@returnboolean */ publicfunctionchmod($path,$perm){ if(!$this->_isconn()){ returnFALSE; } //只有在PHP5中才定义了修改权限的函数(ftp) if(!function_exists('ftp_chmod')){ if($this->debug===TRUE){ $this->_error("ftp_unable_to_chmod(function)"); } returnFALSE; } $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."]"); } returnFALSE; } returnTRUE; } /** *获取目录文件列表 * *@accesspublic *@paramstring目录标识(ftp) *@returnarray */ publicfunctionfilelist($path='.'){ if(!$this->_isconn()){ returnFALSE; } returnftp_nlist($this->conn_id,$path); } /** *关闭FTP * *@accesspublic *@returnboolean */ publicfunctionclose(){ if(!$this->_isconn()){ returnFALSE; } return@ftp_close($this->conn_id); } /** *FTP成员变量初始化 * *@accessprivate *@paramarray配置数组 *@returnvoid */ privatefunction_init($config=array()){ foreach($configas$key=>$val){ if(isset($this->$key)){ $this->$key=$val; } } //特殊字符过滤 $this->hostname=preg_replace('|.+?://|','',$this->hostname); } /** *FTP登陆 * *@accessprivate *@returnboolean */ privatefunction_login(){ return@ftp_login($this->conn_id,$this->username,$this->password); } /** *判断con_id * *@accessprivate *@returnboolean */ privatefunction_isconn(){ if(!is_resource($this->conn_id)){ if($this->debug===TRUE){ $this->_error("ftp_no_connection"); } returnFALSE; } returnTRUE; } /** *从文件名中获取后缀扩展 * *@accessprivate *@paramstring目录标识 *@returnstring */ privatefunction_getext($filename){ if(FALSE===strpos($filename,'.')){ return'txt'; } $extarr=explode('.',$filename); returnend($extarr); } /** *从后缀扩展定义FTP传输模式ascii或binary * *@accessprivate *@paramstring后缀扩展 *@returnstring */ privatefunction_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'; } /** *错误日志记录 * *@accessprvate *@returnboolean */ privatefunction_error($msg){ return@file_put_contents('/tmp/ftp_err.log',"date[".date("Y-m-dH:i:s")."]-hostname[".$this->hostname."]-username[".$this->username."]-password[".$this->password."]-msg[".$msg."]\n",FILE_APPEND); } } /*Endoffileftp.php*/ /*Location/ApacheGroup/htdocs/ftp.php*/
以上所述就是本文的全部内容了,希望大家能够喜欢。