由于本人最近在工作中需要用到sftp上傳文件沫屡,然后各種百度google尋找使用方法。無奈不知道是因?yàn)槲业沫h(huán)境問題還是網(wǎng)上教程的知識太舊還是說我沒有按照正確的方法去使用俱饿。導(dǎo)致我花了半天時(shí)間沒有實(shí)現(xiàn)我想要的效果「柚啵現(xiàn)在踩完坑之后把代碼貼在下面。
ftp版本:
ftp版本的比較簡單稍途,首先安裝好ftp擴(kuò)展,調(diào)用方式如下
$conn = ftp_connect('遠(yuǎn)程服務(wù)器地址', '端口');
ftp_login($conn, '用戶名', '密碼');
ftp_pasv($conn,TRUE);
ftp_set_option($conn,FTP_TIMEOUT_SEC,20);//20秒超時(shí)
$res = ftp_put($conn, $zip, $file, FTP_BINARY);
sftp版本:
業(yè)務(wù)代碼如下:
//$mchnt_cd為文件名
public function uploadFtp($mchnt_cd)
{
try {
$params = ['host' => '遠(yuǎn)程服務(wù)器地址', 'port' => '端口'];
$sftp = new Sftp($params);
$login_result = $this->sftp->login('username','用戶名', '密碼');
if ($login_result !== true) throw new Exception('登錄失敗');
$dir = '/upload/' . date('Ymd', time());//日期文件夾
$is_exist = $this->sftp->dir_exits($dir);//判斷文件夾是否存在
if ($is_exist === false) $this->sftp->ssh2_sftp_mchkdir($dir);//不存在則創(chuàng)建
$dstFile = '/upload/' . date('Ymd', time()) . '/' . $mchnt_cd;//要保存到遠(yuǎn)程服務(wù)器的文件路徑(包括文件名)
$srcFile = FCPATH . 'upload' . DIRECTORY_SEPARATOR . 'updatefile' . DIRECTORY_SEPARATOR . $mchnt_cd;//本地文件目錄
$is_true = $this->sftp->upload_file($srcFile, $dstFile);//文件上傳
if ($is_true !== true) throw new Exception('文件上傳失敗');
return true;
} catch (Exception $e) {
return ['status' => 0, 'msg' => $e->getMessage()];
}
}
sftp版本的封裝sftp上傳類文件:
/**
* Class Sftp
* Since : 2020/6/19 : 17:13
* Description:sftp上傳文檔
* anthor ZhangHuang
*/
class Sftp
{
private $connection;
private $sftp;
public function __construct($params)
{
$host = $params['host'];//地址
$port = $params['port'];//端口
$this->connection = ssh2_connect($host,$port);
if (! $this->connection) throw new Exception("$host 連接 $port 端口失敗");
}
/**
* @param $login_type 登錄類型
* @param $username 用戶名
* @param null $password 密碼
* @param null $pub_key 公鑰
* @param null $pri_key 私鑰
* @return bool
* author: ZhangHuang
* Since : 2020/6/19 : 14:05
* Description:
* @throws Exception
*/
public function login($login_type,$username, $password = null,$pub_key = null,$pri_key = null)
{
switch ($login_type) {
case 'username': //通過用戶名密碼登錄
$login_result = ssh2_auth_password($this->connection, $username, $password);
break;
case 'pub_key': //公鑰私鑰登錄
$login_result = ssh2_auth_pubkey_file($this->connection,$username,$pub_key,$pri_key);
break;
}
if (! $login_result) throw new Exception("身份驗(yàn)證失敗");
$this->sftp = ssh2_sftp($this->connection);
if (! $this->sftp) throw new Exception("初始化sftp失敗");
return true;
}
/**
* @param $local_file 本地文件
* @param $remote_file 遠(yuǎn)程文件
* @return bool
* author: ZhangHuang
* Since : 2020/6/19 : 14:07
* Description: 上傳文件
*/
public function upload_file($local_file, $remote_file)
{
$is_true = copy($local_file, 'ssh2.sftp://'.intval($this->sftp).$remote_file);
return $is_true;
}
/**
* 下載文件
* @param $local_file
* @param $remote_file
*/
public function down_file ($local_file, $remote_file)
{
ssh2_scp_recv($this->connection, $remote_file, $local_file);
}
/**
* 判斷文件夾是否存在
* @param string $dir 目錄名稱
* @return bool
*/
public function dir_exits($dir)
{
$is_dir =is_dir('ssh2.sftp://'.intval($this->sftp).$dir);
return $is_dir;
}
/**
* @param $path 例子 '/home/username/newdir'
* @param int $auth 默認(rèn) 0777的權(quán)限
* author: ZhangHuang
* Since : 2020/6/19 : 14:07
* Description:創(chuàng)建目錄
* @throws Exception
*/
public function ssh2_sftp_mchkdir($path,$auth = 0777) //使用創(chuàng)建目錄循環(huán)
{
$end = ssh2_sftp_mkdir($this->sftp, $path,$auth,false);
if ($end !== true) throw new Exception('文件夾創(chuàng)建失敗');
}
/**
* @param $old_dir 例子:'/home/username/newnamedir'
* @param $new_dir /var/file/image
* @return bool
* author: ZhangHuang
* Since : 2020/6/19 : 14:08
* Description:目錄重命名
*/
public function rename ($old_dir,$new_dir)
{
$is_true = ssh2_sftp_rename($this->sftp,$old_dir,$new_dir);
return $is_true;
}
/**
* 刪除文件
* @param string $dir 例子:'/home/username/dirname/filename'
* $dir 示例:/var/file/image/404NotFound.png
* @return bool
*/
public function del_file ($dir)
{
$is_true = ssh2_sftp_unlink($this->sftp,$dir);
return $is_true;
}
/**
* 獲取文件夾下的文件
* @param string $remote_file 文件路徑 例:/var/file/image
* @return array
*/
public function scan_file_system($remote_file) {
$sftp = $this->sftp;
$dir = "ssh2.sftp://$sftp$remote_file";
$tempArray = array();
$handle = opendir($dir);
// 所有的文件列表
while (false !== ($file = readdir($handle))) {
if (substr("$file", 0, 1) != "."){
if(is_dir($file)){
// $tempArray[$file] = $this->scanFilesystem("$dir/$file");
} else {
$tempArray[]=$file;
}
}
}
closedir($handle);
return $tempArray;
}
}
總結(jié):
我在網(wǎng)上看了很多的實(shí)現(xiàn)方式砚婆,但是用起來基本上沒有一個通的械拍,這個是我花了2個小時(shí)一步步調(diào)試通過的,使用的PHP版本是5.6装盯,sftp上傳文件的前提是安裝好了ssh2的擴(kuò)展坷虑。不知道如何安裝ssh擴(kuò)展的可以翻翻我之前的文章。最后調(diào)試通過還是比較高興的埂奈。之所以再此記錄一下迄损,給后來的人做個參考吧。哈哈~