最近玩项目遇到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响应码。