zoukankan      html  css  js  c++  java
  • go语言实现简易ftp客户端

     
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangxianghehe/article/details/78310249

    Go语言实现的ftp库挺多的,我在这里尝试了一个简单的版本,地址https://github.com/dutchcoders/goftp
    先安装依赖:

    go get -u -v github.com/dutchcoders/goftp
    • 1

    然后配置好ftp服务器,编译执行以下代码,代码包括列出列表和上传功能:

    package main
    
    import (
        "github.com/dutchcoders/goftp"
        "fmt"
        "os"
    )
    
    func main() {
        var err error
        var ftp *goftp.FTP
    
        // For debug messages: goftp.ConnectDbg("ftp.server.com:21")
        if ftp, err = goftp.Connect("server_ip:21"); err != nil {
            panic(err)
        }
    
        defer ftp.Close()
        fmt.Println("Successfully connected !!")
    
    
        // Username / password authentication
        if err = ftp.Login("user", "pass"); err != nil {
            panic(err)
        }
    
        if err = ftp.Cwd("/home/ftp"); err != nil {
            panic(err)
        }
    
        var curpath string
        if curpath, err = ftp.Pwd(); err != nil {
            panic(err)
        }
    
        fmt.Printf("Current path: %s", curpath)
    
        // Get directory listing
        var files []string
        if files, err = ftp.List(""); err != nil {
            panic(err)
        }
        fmt.Println("Directory listing:/n", files)
    
    
        // Upload a file
        var file *os.File
        if file, err = os.Open("E://6楼花名册.xlsx"); err != nil {
            panic(err)
        }
    
        if err := ftp.Stor("/home/ftp/6楼花名册.xlsx", file); err != nil {
            panic(err)
        }
    
    }

    上传文件代码示例如下:

    // Package goftp upload helper
    package goftp
    
    import (
        "os"
        "path/filepath"
    )
    
    func (ftp *FTP) copyDir(localPath string) error {
        fullPath, err := filepath.Abs(localPath)
        if err != nil {
            return err
        }
    
        pwd, err := ftp.Pwd()
        if err != nil {
            return err
        }
    
        walkFunc := func(path string, fi os.FileInfo, err error) error {
            // Stop upon error
            if err != nil {
                return err
            }
            relPath, err := filepath.Rel(fullPath, path)
            if err != nil {
                return err
            }
            switch {
            case fi.IsDir():
                // Walk calls walkFn on root as well
                if path == fullPath {
                    return nil
                }
                if err = ftp.Mkd(relPath); err != nil {
                    if _, err = ftp.List(relPath + "/"); err != nil {
                        return err
                    }
                }
            case fi.Mode()&os.ModeSymlink == os.ModeSymlink:
                fInfo, err := os.Stat(path)
                if err != nil {
                    return err
                }
                if fInfo.IsDir() {
                    err = ftp.Mkd(relPath)
                    return err
                } else if fInfo.Mode()&os.ModeType != 0 {
                    // ignore other special files
                    return nil
                }
                fallthrough
            case fi.Mode()&os.ModeType == 0:
                if err = ftp.copyFile(path, pwd+"/"+relPath); err != nil {
                    return err
                }
            default:
                // Ignore other special files
            }
    
            return nil
        }
    
        return filepath.Walk(fullPath, walkFunc)
    }
    
    func (ftp *FTP) copyFile(localPath, serverPath string) (err error) {
        var file *os.File
        if file, err = os.Open(localPath); err != nil {
            return err
        }
        defer file.Close()
        if err := ftp.Stor(serverPath, file); err != nil {
            return err
        }
    
        return nil
    }
    
    // Upload a file, or recursively upload a directory.
    // Only normal files and directories are uploaded.
    // Symlinks are not kept but treated as normal files/directories if targets are so.
    func (ftp *FTP) Upload(localPath string) (err error) {
        fInfo, err := os.Stat(localPath)
        if err != nil {
            return err
        }
    
        switch {
        case fInfo.IsDir():
            return ftp.copyDir(localPath)
        case fInfo.Mode()&os.ModeType == 0:
            return ftp.copyFile(localPath, filepath.Base(localPath))
        default:
            // Ignore other special files
        }
    
        return nil
    }
  • 相关阅读:
    非关系数据库之mongodb入门到实战(8)mongodb的常用命令
    非关系数据库之mongodb入门到实战(7)mongodb的window版安装与使用详解
    非关系数据库之mongodb入门到实战(6)mongodb基础详解
    非关系数据库之redis入门到实战(5)Redis企业运用
    非关系数据库之redis入门到实战(4)Redis基本操作
    非关系数据库之redis入门到实战(3)Redis入门介绍与安装
    非关系数据库之redis入门到实战(2)Redis常用命令
    非关系数据库之redis入门到实战(1)Redis高级应用
    Java从入门到实战之(16)面向对象之对象的多态性(四)
    Java从入门到实战之(15)面向对象之接口(三)
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/9554849.html
Copyright © 2011-2022 走看看