二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Shell编程

  • Go编程笔记

    • 开发技巧

    • 库包研究

      • 使用gorm进行联合查询的整理总结
      • 一个ftp客户端的封装
      • 使用go-bindata将文件编译进二进制
      • go-gitlab包源码探寻与心得
      • 利用cobra库快速开发类似kubectl一样的命令行工具
      • 使用MongoDB官方go库操作MongoDB
      • 再探-利用gorm自身提供的方法实现MySQL中数据关联的能力
      • 使用retry-go给项目添加重试机制
      • go-cache包的使用简析
      • 利用gorm自身提供的方法实现存在更新不存在则创建的能力
      • 近期关于cobra库的一些实践心得总结
    • 个人项目

  • 前端编程笔记

  • Go学习笔记

  • Vue-21年学习笔记

  • Vue-22年重学笔记

  • 编程世界
  • Go编程笔记
  • 库包研究
二丫讲梵
2021-07-10

一个ftp客户端的封装

文章发布较早,内容可能过时,阅读注意甄别。

公司一个业务的程序需要解析一些外部数据,而这些数据需要每天定时从外部 ftp 点拉取,常理来讲,我们可以使用 Linux 中的 lftp 来进行 download,但是这样定义的脚本,将会把连接 ftp 的用户名密码等信息暴漏在外,不够安全。

最近在学 go,因此想着用 go 语言来对功能做一下封装。

需求也非常简单:

  1. 制作一个 ftp 客户端工具,不必配置其他内容,将用户名密码连接地址封装进去。
  2. 可以通过命令行指定要下载的文件,下载到指定位置。

搞程序都是面向 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

各处关键地方都已经进行注释了,此时可以编译一下程序:

go build
1

然后查看帮助信息:

$ ./gftp -h
Usage of ./gftp:
  -file string
        请输入将要下载的文件路径 (default "test-file.txt")
1
2
3
4
微信 支付宝
上次更新: 2024/06/13, 22:13:45
使用gorm进行联合查询的整理总结
使用go-bindata将文件编译进二进制

← 使用gorm进行联合查询的整理总结 使用go-bindata将文件编译进二进制→

最近更新
01
记录二五年五一之短暂回归家庭
05-09
02
学习周刊-总第210期-2025年第19周
05-09
03
学习周刊-总第209期-2025年第18周
05-03
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式