最近因为要用最一个简易网盘,主要功能是对接企业已有的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 }
因为能力有限,架上功能比较简单就是一个小文件的下载,所以这里就简单打个样,如果有人写了不错的文件处理,请把链接留在本文评论,以供大家参考。