golang连接ftp服务器

最近因为要用最一个简易网盘,主要功能是对接企业已有的ftp服务器和smb服务器。这篇博客主要是讲golang对接ftp服务器

go get github.com/dutchcoders/goftp

  使用的是一个荷兰开发者作为主导的包,当时主要是因为有一个博主在CSDN上分享过这个包的使用方法,所以当时就去看了下这个包的源码。

1.连接

goftp.Connect(connConfig)
// connConfig是地址配置,ip:端口的一个字符串,如:localhost:2121

  这个方法执行过之后会返回一个ftp连接对象和err,之后拿着这个ftp对象就可以去使用内置的方法对ftp服务器进行操作了

2.登录

theConn.Login(username, pwd)
// theConn是1中返回的ftp对象

  这个就是登录ftp服务器,还是操作之前的ftp对象,也就是goftp.FTP这个类实例化出的对象的方法。

3.获取当前路径

theConn.Pwd()

4.切换路径

theConn.Cwd("路径")

  切换工作目录,这个是基于当前路径走的。如果刚登录FTP服务器的话,你的路径打印Pwd的结果就是空字符串。这时候输入相对路径即可。这个参数是支持.(当前目录)和..(上级目录)的。如果是在根目录下,切换..是不会报错的,还是在当前目录。

5.查看当前目录

theConn.List("")

  参数同上,执行完之后显示的是目录结构和各个文件或文件夹的权限,这里返回的是一个大字符串。我是通过正则做的匹配。\\S*\r\n获取名称,^[d-](\\S*)\\s获取读写权限,这两个都是regexp.Compile的参数。

以上是一些基础方法,还有一些其他的,可以去看源码。比如Rename重命名,Mkd新建文件夹。

下面说一下这个的上传和下载(上传源码处是有实例的,可以直接去github里面看,或者参考博客https://blog.csdn.net/xiangxianghehe/article/details/78310249

上传的话之前说的那个类里有一个Retr方法,这个方法需要两个参数,第一个是文件名,第二个是一个文件处理方法

type (
// WalkFunc is called on each path in a Walk. Errors are filtered through WalkFunc
	WalkFunc func(path string, info os.FileMode, err error) error

// RetrFunc is passed to Retr and is the handler for the stream received for a given path
	RetrFunc func(r io.Reader) error
)

  源码中只定义了这个接口,但是没有实现,因为这个对于每个文件的处理都是不一样的,需要你自己去定义自己需要的这个文件操作,因此只要去实现这个方法,在调用下载接口的时候传入你的方法就行了。

type File2 struct {
	Name    string
	Content []byte
}

func (f *File2) GetFile(r io.Reader) error {
	var buf = new(bytes.Buffer)
	_, err := io.Copy(buf, r)
	CheckErr(err)
	var n = buf.Len()
	var res = []byte{}
	for {
		var b []byte
		switch {
		case n > 1024:
			b = make([]byte, 1024)
			n -= 1024
		default:
			b = make([]byte, n)
		}
		fmt.Println(len(b))
		size, err := buf.Read(b)
		if err != nil && err != io.EOF {
			fmt.Println(err)
			return err
		}
		if size == 0 {
			break
		}
		res = append(res, b...)
	}
	fmt.Println(res)
	f.Content = res
	return nil
}

  因为能力有限,架上功能比较简单就是一个小文件的下载,所以这里就简单打个样,如果有人写了不错的文件处理,请把链接留在本文评论,以供大家参考。

posted @ 2020-05-18 15:55  XiaoBoya  阅读(3662)  评论(0编辑  收藏  举报