php通過ftp以及sftp上傳文件

由于本人最近在工作中需要用到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)試通過還是比較高興的埂奈。之所以再此記錄一下迄损,給后來的人做個參考吧。哈哈~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末账磺,一起剝皮案震驚了整個濱河市芹敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垮抗,老刑警劉巖氏捞,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冒版,居然都是意外死亡液茎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捆等,“玉大人滞造,你說我怎么就攤上這事《翱荆” “怎么了谒养?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長班缎。 經(jīng)常有香客問我蝴光,道長,這世上最難降的妖魔是什么达址? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任蔑祟,我火速辦了婚禮,結(jié)果婚禮上沉唠,老公的妹妹穿的比我還像新娘疆虚。我一直安慰自己,他們只是感情好满葛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布径簿。 她就那樣靜靜地躺著,像睡著了一般嘀韧。 火紅的嫁衣襯著肌膚如雪篇亭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天锄贷,我揣著相機(jī)與錄音译蒂,去河邊找鬼。 笑死谊却,一個胖子當(dāng)著我的面吹牛柔昼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炎辨,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼捕透,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碴萧?” 一聲冷哼從身側(cè)響起乙嘀,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎破喻,沒想到半個月后乒躺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡低缩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年嘉冒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曹货。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡讳推,死狀恐怖顶籽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情银觅,我是刑警寧澤礼饱,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站究驴,受9級特大地震影響镊绪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洒忧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蝴韭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熙侍,春花似錦榄鉴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巷送,卻和暖如春驶忌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笑跛。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工付魔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堡牡。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓抒抬,卻偏偏與公主長得像杨刨,于是被迫代替她去往敵國和親晤柄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350