版权声明:本文为博主原创文章,未经博主允许不得转载。 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 }