最近因為要用最一個簡易網盤,主要功能是對接企業已有的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
}
因為能力有限,架上功能比較簡單就是一個小文件的下載,所以這里就簡單打個樣,如果有人寫了不錯的文件處理,請把鏈接留在本文評論,以供大家參考。
