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
    }
  • 相关阅读:
    如何抓住用户痛点做产品?
    分析需求场景对产品设计的意义
    【用户分析-用户场景】这TM才是产品思维!
    WebUploader实现浏览器端大文件分块上传
    npm 安装包报错 rollbackFailedOptional
    PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)...
    PAT 甲级 1071 Speech Patterns (25 分)(map)
    P3370 【模板】字符串哈希
    PageRank算法原理与Python实现
    PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)...
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/9554849.html
Copyright © 2011-2022 走看看