SFTP

用于远程传输文件;基于SSH协议设计,所以传输文件前首先要建立SSH连接,在 Golang | SSH Note 有关于SSH包的使用笔记,同时,使用SSH也可以完成远程文件传输。

Demo

官方示例:基本包含了常用的业务情景代码。

建立SSH连接

👉 Golang | SSH Note

创建SFTP客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// NewSftpClient receive *ssh.Client as parameter that be used to initialize *sftp.Client
func NewSftpClient (sshClient *ssh.Client) (*sftp.Client, error) {
    var (
        err         error
        sftpClient  *sftp.Client
    )
    
    if sftpClient, err = sftp.NewClient(sshClient); err != nil {
        fmt.Println(err.Error())
        return nil, err
    }
    return sftpClient, nil
}

发送文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func uploadFile(file string, sftpClient *sftp.Client) {
    srcFile, err := os.Open(file)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer srcFile.Close()

    remoteDir := "/remote/dir"
    remoteFilename := path.Base(file)
    dstFile, err := sftpClient.Create(path.Join(remoteDir, remoteFilename))
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer dstFile.Close()

    buf := make([]byte, 1024)
    for {
        n, _ := srcFile.Read(buf)
        if n == 0 {
            break
        }
        dstFile.Write(buf)
    }
}

获取文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func downloadFile(remoteFile string, sftpClient *sftp.Client) {
    srcFile, err := sftpClient.Open(remoteFile)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer srcFile.Close()

    localDir := "/local/dir"
    localFilename := path.Base(remoteFile)
    dstFile, err := os.Create(path.Join(localDir, localFilename))
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer dstFile.Close()

    if _, err := srcFile.WriteTo(dstFile); err != nil {
        fmt.Println(err.Error())
        return
    }
}

See Also

Thanks to the authors 🙂