一个ftp客户端的封装
文章发布较早,内容可能过时,阅读注意甄别。
公司一个业务的程序需要解析一些外部数据,而这些数据需要每天定时从外部 ftp 点拉取,常理来讲,我们可以使用 Linux 中的 lftp 来进行 download,但是这样定义的脚本,将会把连接 ftp 的用户名密码等信息暴漏在外,不够安全。
最近在学 go,因此想着用 go 语言来对功能做一下封装。
需求也非常简单:
- 制作一个 ftp 客户端工具,不必配置其他内容,将用户名密码连接地址封装进去。
- 可以通过命令行指定要下载的文件,下载到指定位置。
搞程序都是面向 GitHub 编程,我并不会凭空写什么东西,于是也一样先去找了一下关于 ftp 的轮子,最后找到了github.com/jlaffaye/ftp (opens new window)。
就此开始,我也开启了人生第一次自主地开发一个简单的小工具。
最终写出代码如下:
package main
import (
"flag"
"fmt"
"github.com/jlaffaye/ftp"
"io/ioutil"
"os"
"strings"
"time"
)
func main() {
// 通过ftp内置的Dial连接远程ftp,获得一个连接对象c
c, err := ftp.Dial("192.168.0.22:21", ftp.DialWithTimeout(5*time.Second))
if err != nil {
fmt.Printf("conn ftp failed, err:%v\n", err)
return
}
// Login 使用用户名密码进行认证
err = c.Login("ftp_usera", "123456")
if err != nil {
fmt.Printf("login ftp failed, err:%v\n", err)
return
}
// 此处定义一个命令行参数,以定义将要下载的文件,如果文件不在根目录,可以使用全路径
name := flag.String("file", "test-file.txt", "请输入将要下载的文件路径")
flag.Parse()
// 创建一个读取文件内容的对象
r, err := c.Retr(*name)
if err != nil {
fmt.Println("retr file failed, err", err)
return
}
// 使用ioutil读取刚刚对象的内容
buf, err := ioutil.ReadAll(r)
if err != nil {
fmt.Printf("read file failed, err:%v\n", err)
return
}
// 定义文件下载之后保存在本地的路径,因为这里是一个固定的位置,因此写死了,在固定路径下,按天进行分割保存
path := "/data/www/storage/jzbbankcode" + "/" + time.Now().Format("20060102")
err = os.MkdirAll(path, 0755) //先创建如上定义的路径
if err != nil {
fmt.Printf("mkdir directory failed, err:%v\n", err)
return
}
// 通过截取定义用户输入的文件路径最后一段,从而获取到文件名,以放入本地
s1 := strings.Split(*name, "/")
_file := path + "/" + s1[len(s1)-1]
err = ioutil.WriteFile(_file, []byte(buf), 0644)
if err != nil {
fmt.Printf("write file failed, err:%v\n", err)
return
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
各处关键地方都已经进行注释了,此时可以编译一下程序:
go build
1
然后查看帮助信息:
$ ./gftp -h
Usage of ./gftp:
-file string
请输入将要下载的文件路径 (default "test-file.txt")
1
2
3
4
2
3
4
上次更新: 2024/12/05, 21:39:23