zoukankan      html  css  js  c++  java
  • 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* 获取名称,^[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
    }
    

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

  • 相关阅读:
    javascript 创建字典
    IE显示PNG
    透明PNG背景图片 For IE 6.0 Firefox Opera
    IE FireFox对CSS的不同解释收集
    javascript中replace()
    netstat 指令返回结果中state含义
    FIREFOX层的自适应高度
    select options的操作
    事件冒泡
    C++第三讲笔记
  • 原文地址:https://www.cnblogs.com/XiaoBoya/p/12911058.html
Copyright © 2011-2022 走看看