Golang FTP library with Walk support.
- AUTH TLS support
- Walk
package main
import (
"crypto/sha256"
"crypto/tls"
"fmt"
"io"
"os"
"encoding/hex"
"gopkg.in/dutchcoders/goftp.v1"
)
func main() {
var err error
var ftp *goftp.FTP
// For debug messages: goftp.ConnectDbg("ftp.server.com:21")
if ftp, err = goftp.Connect("ftp.server.com:21"); err != nil {
panic(err)
}
defer ftp.Close()
fmt.Println("Successfully connected to", server)
// TLS client authentication
config := tls.Config{
InsecureSkipVerify: true,
ClientAuth: tls.RequestClientCert,
}
if err = ftp.AuthTLS(config); err != nil {
panic(err)
}
// Username / password authentication
if err = ftp.Login("username", "password"); err != nil {
panic(err)
}
if err = ftp.Cwd("/"); 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:", files)
// Upload a file
var file *os.File
if file, err = os.Open("/tmp/test.txt"); err != nil {
panic(err)
}
if err := ftp.Stor("/test.txt", file); err != nil {
panic(err)
}
// Download each file into local memory, and calculate it's sha256 hash
err = ftp.Walk("/", func(path string, info os.FileMode, err error) error {
_, err = ftp.Retr(path, func(r io.Reader) error {
var hasher = sha256.New()
if _, err = io.Copy(hasher, r); err != nil {
return err
}
hash := fmt.Sprintf("%s %x", path, hex.EncodeToString(hasher.Sum(nil)))
fmt.Println(hash)
return err
})
return nil
})
}
Contributions are welcome.
- Sourav Datta: for his work on the anonymous user login and multiline return status.
- Vincenzo La Spesa: for his work on resolving login issues with specific ftp servers
Remco Verhoef
Code and documentation copyright 2011-2014 Remco Verhoef. Code released under the MIT license.