package main import ( "bytes" "errors" "github.com/dutchcoders/goftp" "io" "os" "path/filepath" "strings" ) func FtpDemo() { var err error var ftp *goftp.FTP // For debug messages: goftp.ConnectDbg("ftp.server.com:21") if ftp, err = goftp.Connect("123.207.246.51:21"); err != nil { panic(err) } defer ftp.Close() // Username / password authentication if err = ftp.Login("go-build", "7Jp7PJkcnTHbcNtZ"); err != nil { panic(err) } file := strings.NewReader("hello worldxxxxx") if err := ftp.Stor("test.txt", file); err != nil { panic(err) } } // 工具--> //支持命令行, //json配置 //yaml配置 //跨平台编译 //ftp上传 // 不存在0 目录1 文件2 func PathStat(path string) (int, error) { info, err := os.Stat(path) if os.IsNotExist(err) { // 如果不存在 return 0, nil } else if err != nil { return -1, err } else if info.IsDir() { return 1, nil } else { return 2, nil } } func PathExist(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } else if os.IsNotExist(err) { return false, nil } return false, err } type Ftp struct { ftp *goftp.FTP Addr string `json:"addr"` // 地址 Port string `json:"port"` //端口 Username string `json:"username"` // 用户 Password string `json:"password"` // 密码 } func Connect(addr string, port string, username string, password string) (*Ftp, error) { var f *goftp.FTP var err error f, err = goftp.Connect(addr + ":" + port) if err != nil { return nil, err } // 登录 err = f.Login(username, password) if err != nil { return nil, err } return &Ftp{ ftp: f, Addr: addr, Port: port, Username: username, Password: password, }, nil } func (f *Ftp) Size(path string) (int, error) { return f.ftp.Size(path) } func (f *Ftp) Stat(path string) ([]string, error) { return f.ftp.Stat(path) } // 路径和名字 func (f *Ftp) Send(path string, reader io.Reader) error { return f.ftp.Stor(path, reader) } func (f *Ftp) SendFile(path, name string) error { var file *os.File var err error file, err = os.Open(name) if err != nil { return err } return f.Send(path, file) } // 发送字符串 func (f *Ftp) SendString(path, data string) error { return f.Send(path, strings.NewReader(data)) } // 发送字节 func (f *Ftp) SendBytes(path string, data []byte) error { return f.Send(path, bytes.NewReader(data)) } // 接收文件 func (f *Ftp) Receive(path string, fn func(io.Reader) error) (string, error) { return f.ftp.Retr(path, fn) } // 发送到某个文件 func (f *Ftp) ReceiveToFile(path, file string) error { var err error // 完善file if file == "" { file = path } else if !strings.HasSuffix(file, filepath.Base(file)) { file = filepath.Join(file, filepath.Base(path)) } stat, err := PathStat(filepath.Dir(file)) if err != nil { return err } if stat == 0 { err = os.MkdirAll(filepath.Dir(file), 0666) if err != nil { return err } } else if stat == 2 { return errors.New("目录路径为文件") } _, err = f.Receive(path, func(reader io.Reader) error { var f1 *os.File _, err = os.Stat(file) if os.IsNotExist(err) { f1, err = os.Create(file) if err != nil { return err } } else if err != nil { return err } else { f1, err = os.Open(file) if err != nil { return err } } _, err = io.Copy(f1, reader) return nil }) return err } // 打印出来 func (f *Ftp) ReceiveToPrint(path string) (string, error) { return f.Receive(path, func(reader io.Reader) error { var err error _, err = io.Copy(os.Stdout, reader) return err }) } // 关闭 func (f *Ftp) Close() error { return f.ftp.Quit() } // 上传 func (f *Ftp) Upload(localPath string) error { return f.ftp.Upload(localPath) } func main() { }