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*/
以上所述就是本文的全部内容了,希望大家能够喜欢。