php使用sftp上傳文件

1.安裝ssh擴展,在擴展連接下載對應版本的擴展放到php/ext/下,而後更改php.ini,輸出phpinfo(),能看到就表示成功了
clipboard.pngphp

2.控制器代碼(框架用的CI)框架

clipboard.png

sftp類代碼:ssh

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/8/22
 * Time: 16:00
 */
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 string $login_type 登陸類型
     * @param string $username  用戶名
     * @param string $password  密碼
     * @param string  $pub_key  公鑰
     * @param string $pri_key  私鑰
     * @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("身份驗證失敗");
        $this->sftp = ssh2_sftp($this->connection);
        if (! $this->sftp) throw new Exception("初始化sftp失敗");
        return true;
    }

    /**
     * 上傳文件
     * @param string $local_file 本地文件
     * @param string $remote_file  遠程文件
     * @throws Exception
     */
    public function upload_file($local_file, $remote_file)
    {
        $is_true = ssh2_scp_send($this->connection, $local_file, $remote_file, 0777);
        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)
    {
        return file_exists("ssh2.sftp://$this->sftp".$dir);
    }


    /**
     * 建立目錄
     * @param string $path 例子  '/home/username/newdir'
     * @param int $auth 默認 0777的權限
     */
    public function ssh2_sftp_mchkdir($path,$auth = 0777)  //使用建立目錄循環
    {
        $end = ssh2_sftp_mkdir($this->sftp, $path,$auth,true);
        if ($end !== true) throw new Exception('文件夾建立失敗');
    }

    /**
     * 目錄重命名
     * @param string $dir 例子:'/home/username/newnamedir'
     * $dir 示例:/var/file/image
     * @return bool
     */
    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;
    }
}

參考連接:https://www.php.net/manual/zh...this

相關文章
相關標籤/搜索