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 }

转载于:https://www.cnblogs.com/lvdongjie/p/9554849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值