PHP針對ftp檔案的操作方法,如果是隻操作一個ftp,可以使用裡面的單利模式,
不需要每次都去執行個體化,我的項目中需要去連結很多個ftp伺服器;
是以需要多次去連接配接和關閉;<?php
namespace App\Tools;
class FtpFile
{
static private $_instance=null;
private $ftp = null;
public $off; // 傳回操作狀态(成功/失敗)
//私有的構造方法
public function __construct($config){
//執行個體化
$this->ftp = @ftp_connect($config['ftp_ip'],$config['ftp_port']) or die("FTP connection fail");
//登入驗證
@ftp_login($this->ftp,$config['ftp_username'],$config['ftp_password']);
//是否開啟被動模式
if (isset($config['ftp_pasv']))
{
@ftp_pasv($this->ftp,true);
}
}
static public function getInstance($config){
if(!(self::$_instance instanceof self)){
self::$_instance = new FtpFile($config);
}
return self::$_instance;
}
function up_file($path,$newpath,$type=true)
{
if($type) $this->dir_mkdirs($newpath);
$this->off = @ftp_put($this->ftp,$newpath,$path,FTP_BINARY);
if(!$this->off)
{
return "檔案上傳失敗,請檢查權限及路徑是否正确!";
}else{
//删除檔案
unlink($path);
return true;
}
}
public function uploadFile($files=[],$type=true)
{
if (is_array($files))
{
foreach ($files as $key=>$file)
{
if($type)
{
$this->dir_mkdirs($file);
}
$this->off = @ftp_put($this->ftp,$file,$key,FTP_BINARY);
if(!$this->off)
{
logs('ftp.txt',date('Y-m-d H:i:s').$file."檔案上傳錯誤");
}else{
//删除檔案
unlink($key);
// return true;
}
}
}
if(!$this->off)
{
//logs函數自定義日志
logs('ftp.txt',date('Y-m-d H:i:s').$file."檔案上傳錯誤");
return false;
}else{
return true;
}
}
function move_file($path,$newpath,$type=true)
{
if($type) $this->dir_mkdirs($newpath);
$this->off = @ftp_rename($this->ftp,$path,$newpath);
if(!$this->off) {
return "檔案移動失敗,請檢查權限及原路徑是否正确!";
}else{
return true;
}
}
function copy_file($path,$newpath,$type=true)
{
$downpath = "/var/www/temp.txt";
$this->off = @ftp_get($this->ftp,$downpath,$path,FTP_BINARY);// 下載下傳
if(!$this->off)
{
return "檔案複制失敗,請檢查權限及原路徑是否正确!";
}
$this->up_file($downpath,$newpath,$type);
}
function del_file($path)
{
$this->off = @ftp_delete($this->ftp,$path);
if(!$this->off){
return false;
}
}
function dir_mkdirs($path)
{
$path_arr = explode('/',$path); // 取目錄數組
$file_name = array_pop($path_arr); // 彈出檔案名
$path_div = count($path_arr); // 取層數
foreach($path_arr as $val) // 建立目錄
{
if(@ftp_chdir($this->ftp,$val) == FALSE)
{
$tmp = @ftp_mkdir($this->ftp,$val);
if($tmp == FALSE)
{
exit;
}
@ftp_chdir($this->ftp,$val);
}
}
for($i=1;$i<=$path_div;$i++) // 回退到根
{
@ftp_cdup($this->ftp);
}
}
public function close()
{
@ftp_close($this->ftp);
}
public function __destruct()
{
// TODO: Implement __destruct() method.
//@ftp_close($this->ftp);
}
}
lavarel中直接調用;
單例模式調用:FtpFile::getInstance($this->data)->up_file($location_file,$remote_file);
不是單例模式調用;$ftp = new FtpFile($this->data);
$ftp->uploadFile($filearr);
$ftp->close();