PHP 实现 SFTP 上传文件

一、SFTP介绍
使用SSH协议进行FTP传输的协议叫SFTP(安全文件传输)Sftp和Ftp都是文件传输协议。区别:sftp是ssh内含的协议(ssh是加密的telnet协议), 只要sshd服务器启动了,它就可用,而且sftp安全性较高,它本身不需要ftp服务器启动。 sftp = ssh + ftp(安全文件传输协议)。由于ftp是明文传输的, 没有安全性,而sftp基于ssh,传输内容是加密过的,较为安全。目前网络不太安全,以前用telnet的都改用ssh2(SSH1已被破解)。

    sftp这个工具和ftp用法一样。但是它的传输文件是通过ssl加密了的,即使被截获了也无法破解。而且sftp相比ftp功能要多一些,多了一些文件属性的设置。

二、SSH2扩展配置

  1. 下载地址:http://windows.php.net/downloads/pecl/rele...
    根据自己的php版本选择 扩展包,这里我使用的是php5.3,所以我下载的是 php_ssh2-0.12-5.3-ts-vc9-x86.zip

  2. 解压完后,会有三个文件,libssh2.dll、php_ssh.dll、php_ssh2.pdb。

  3. 将 php_ssh.dll、php_ssh2.pdb 放到你的 php 扩展目录下 php/ext/ 下。

  4. 将libssh2.dll 复制到 c:/windows/system32 和 c:/windows/syswow64 各一份

    5.在 php.ini中加入 extension=php_ssh2.dll

    6.重启Apache, 打印phpinfo(); 会出现 SSH2 扩展,表示安装成功
    file

三、SFTP 代码DEMO
控制器

public function getSftpData(){
       $time = date('Ymd',time());
       $localpath='***';   //本地文件目录
       $serverpath='user_group';  //远程目录(需要上传到的目录)
       $config = array("host"=>"ip","username"=>"账号","port"=>"22","password"=>"密码");
        try {
            $sftp = new \sftpData($config);

            $re = $sftp->ssh2_dir_exits("/upload/$serverpath/$time");
            //如果目录存在直接上传
            if($re){
                $sftp->upftp("$localpath",'/upload/'.$serverpath.'/'.$time.'/'.$serverpath.'.dat.gz');
            }else{
                $sftp->ssh2_sftp_mchkdir("/upload/$serverpath/$time");
                $sftp->upftp("$localpath",'/upload/'.$serverpath.'/'.$time.'/'.$serverpath.'.dat.gz');
            }

            die('ok');
        } catch (\Exception $e) {
            die('连接失败!');
        }
    }

sftp类

class sftpData{
        // 初始配置为NULL
        private $config = NULL;
        // 连接为NULL
        private $conn = NULL;
        //sftp resource 
        private $ressftp = NULL;
        // 初始化
        public function __construct($config)
        {
         $this->config = $config;
         $this->connect();
        }

        public function connect()
        {

         $this->conn = ssh2_connect($this->config['host'], $this->config['port']);
         if( ssh2_auth_password($this->conn, $this->config['username'], $this->config['password']))
         {
                $this->ressftp = ssh2_sftp($this->conn);

         }else{ 
                echo "用户名或密码错误";
         }

        }

        // 下载文件
        public function downftp($remote, $local)
        { 
                return copy("ssh2.sftp://{$ressftp}".$remote, $local);
        }

        // 文件上传
        public function upftp( $local,$remote, $file_mode = 0777)
        { 
                return copy($local,"ssh2.sftp://{$this->ressftp}".$remote); 
                // return ssh2_scp_send($this->ressftp,$local,$remote,$file_mode); 
        }
        //创建目录
        public function ssh2_sftp_mchkdir($path)  //使用创建目录循环
        {
                ssh2_sftp_mkdir($this->ressftp, $path,0777,true);
        }
        //判段目录是否存在
        public function ssh2_dir_exits($dir){
                return file_exists("ssh2.sftp://{$this->ressftp}".$dir);
        }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

这个很不错。刚好能用到!

6年前

lftp操作起来更方便一些

6年前

免登陆的咋整??

3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!