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