day08-Go操作FTP文件存储服务器 | 青训营笔记

415 阅读4分钟

最近玩项目遇到FTP文件存储服务器,特地学了一些它与Go的生态,特此记录下来;

1、FTP文件存储服务器

FTP是一种网络协议,它用于在计算机之间传输文件。在FTP中,文件通常被存储在FTP服务器上,FTP客户端可以连接到服务器并上传或下载文件。通常情况下,FTP服务器会有一个根目录,里面包含着所有的文件和文件夹。FTP客户端可以通过输入用户名和密码登录到FTP服务器,并访问服务器上的文件。一旦登录成功,客户端就可以浏览服务器上的文件,并上传或下载它们。FTP服务器可以在计算机上运行,也可以在互联网上运行。许多公司和组织使用FTP来存储和分享文件,包括软件更新、音乐、视频和文档等。

2、简单使用

假如我的文件地址如下://10.10.30.5/FTP/kf_soa/dbf/daily/20230508.png,以下是一个简单的GO语言方案,用于通过FTP读取文件数据并将其传递给前端:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    // 设置FTP服务器地址、用户名和密码
    server := "10.10.30.5"
    user := "your_username"
    pass := "your_password"
    // 设置FTP文件路径
    file := "/FTP/kf_soa/dbf/daily/20230508.png"
    // 构造FTP URL
    ftpUrl := fmt.Sprintf("ftp://%s:%s@%s%s", user, pass, server, file)

    // 通过HTTP GET请求获取FTP文件数据
    resp, err := http.Get(ftpUrl)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()

    // 读取HTTP响应体中的数据
    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 将数据传递给前端
    fmt.Println(string(data))
}

需要注意的是,这个方案中使用了HTTP GET请求来获取FTP文件数据。这是因为大多数浏览器只支持HTTP或HTTPS协议,而不支持FTP协议。因此,我们需要将FTP URL转换为HTTP URL,并通过HTTP GET请求来获取文件数据。在这个例子中,我们使用了Go标准库中的"net/http"和"io/ioutil"包来实现这个功能。

另外,需要替换代码中的FTP服务器地址、用户名、密码和文件路径为你自己的信息。

3、与gin框架结合使用

如果你使用Gin框架,可以在Gin的路由处理函数中调用与前面类似的HTTP GET请求代码,将FTP文件数据传递给前端。下面是一个简单的示例代码:

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.GET("/file", func(c *gin.Context) {
		// 设置FTP服务器地址、用户名和密码
		server := "10.10.30.5"
		user := "your_username"
		pass := "your_password"
		// 设置FTP文件路径
		file := "/FTP/kf_soa/dbf/daily/20230508.png"
		// 构造FTP URL
		ftpUrl := fmt.Sprintf("ftp://%s:%s@%s%s", user, pass, server, file)

		// 通过HTTP GET请求获取FTP文件数据
		resp, err := http.Get(ftpUrl)
		if err != nil {
			c.String(http.StatusInternalServerError, "Failed to get file: %v", err)
			return
		}
		defer resp.Body.Close()

		// 读取HTTP响应体中的数据
		data, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			c.String(http.StatusInternalServerError, "Failed to read file: %v", err)
			return
		}

		// 将数据传递给前端
		c.Data(http.StatusOK, resp.Header.Get("Content-Type"), data)
	})

	r.Run(":8080")
}

在这个例子中,我们使用了Gin框架中的gin.Context类型来访问请求和响应对象,并使用c.Data()方法将FTP文件数据传递给前端。需要注意的是,这个方法需要指定HTTP响应的Content-Type头,以便浏览器正确解析文件数据。在这个例子中,我们从HTTP响应头中获取Content-Type头,并将其传递给c.Data()方法。

你需要将代码中的FTP服务器地址、用户名、密码和文件路径替换为你自己的信息。此外,你还需要根据你的实际情况修改路由处理函数的路径和HTTP响应码。

4、使用Go语言的FTP客户端库获取某一目录下所有文件

要获取FTP服务器中某个目录下的所有文件名,并将它们返回给前端,可以使用Go语言的FTP客户端库,例如github.com/jlaffaye/ftp。下面是一个示例代码,使用该库从FTP服务器中获取某个目录下的所有文件名:

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/jlaffaye/ftp"
)

func main() {
	r := gin.Default()

	r.GET("/files", func(c *gin.Context) {
		// 设置FTP服务器地址、用户名和密码
		server := "10.10.30.5"
		user := "your_username"
		pass := "your_password"

		// 连接FTP服务器
		client, err := ftp.Dial(fmt.Sprintf("%s:21", server))
		if err != nil {
			log.Fatal(err)
		}
		defer client.Quit()

		// 登录FTP服务器
		if err := client.Login(user, pass); err != nil {
			log.Fatal(err)
		}

		// 获取FTP服务器上的某个目录下的所有文件名
		files, err := client.List("/FTP/kf_soa/dbf/daily")
		if err != nil {
			log.Fatal(err)
		}

		// 将文件名列表传递给前端
		var filenames []string
		for _, file := range files {
			if file.Type == ftp.EntryTypeFile {
				filenames = append(filenames, file.Name)
			}
		}
		c.JSON(http.StatusOK, gin.H{"files": filenames})
	})

	r.Run(":8080")
}

在这个例子中,我们使用了github.com/jlaffaye/ftp库中的ftp.Dial()方法来连接FTP服务器,并使用ftp.Login()方法登录FTP服务器。然后,我们使用ftp.List()方法获取FTP服务器上的某个目录下的所有文件名,并将它们添加到一个文件名列表中。最后,我们使用c.JSON()方法将文件名列表传递给前端。

你需要将代码中的FTP服务器地址、用户名、密码和目录路径替换为你自己的信息。此外,你还需要根据你的实际情况修改路由处理函数的路径和HTTP响应码。