gpt4 book ai didi

golang实现ftp实时传输文件的案例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章golang实现ftp实时传输文件的案例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、项目简介 。

本项目主要实现的功能是ftp客户端不断地将xml文件和jpg文件实时地上传到服务器,当然也可以是其他格式的文件。每当ftp客户端取到一个文件之后,将文件上传到服务器后,然后将其删除.

项目实现可配置,如果开发者有类似的需求,只需要修改配置文件就可以使用本项目去完成上传文件的功能.

本项目打日志是按照当天时间来生成日志文件,每天每一种类型的日志只打一个文件.

2、项目结构图片 。

golang实现ftp实时传输文件的案例

3、项目代码 。

config配置中的代码 。

config.ini 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[path]
   xml_path     = D:\\dian\\out\\    # xml文件所在的路径
   img_path     = D:\\dian\\out\\wave\\ # 图片文件所在路径
[ftp]
   ftpfile_path   = D:\\Itudou       # 在服务器上的文件存储路径
   ftp_server_ip  = 192.168.56.1      # ftp服务器的IP
   ftp_server_port = 21           # ftp服务器的端口
   ftp_server_name = 20123762        # ftp服务器的用户名
   ftp_server_pwd  = 123456         # ftp服务器的密码
   local_ip     = 192.168.56.1      # 本地主机的IP
   local_port    = 80           #本地主机端口
   comm_way     = udp          #ftp的通信方式
[file]
   file_img     =.jpg          #文件后缀为img
   file_xml     =.xml          #文件后缀为xml
   log_print    = ture          #是否打日志,生产环境上不打日志,在调式程序的时候使用

读配置文件的代码 。

daos_config.go 。

  。

?
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package daosconfig
import (
   "bufio"
   "io"
   "os"
   "strings"
)
type Config struct {
   Mymap map[string]string
   strcet string
}
func (c *Config) InitConfig(path string) {
   c.Mymap = make(map[string]string)
   f, err := os.Open(path)
   if err != nil {
     panic(err)
   }
   defer f.Close()
   r := bufio.NewReader(f)
   for {
     b, _, err := r.ReadLine()
     if err != nil {
       if err == io.EOF {
         break
       }
       panic(err)
     }
     s := strings.TrimSpace(string(b))
     if strings.Index(s, "#") == 0 {
       continue
     }
     n1 := strings.Index(s, "[")
     n2 := strings.LastIndex(s, "]")
     if n1 > -1 && n2 > -1 && n2 > n1+1 {
       c.strcet = strings.TrimSpace(s[n1+1 : n2])
       continue
     }
     if len(c.strcet) == 0 {
       continue
     }
     index := strings.Index(s, "=")
     if index < 0 {
       continue
     }
     frist := strings.TrimSpace(s[:index])
     if len(frist) == 0 {
       continue
     }
     second := strings.TrimSpace(s[index+1:])
     pos := strings.Index(second, "\t#")
     if pos > -1 {
       second = second[0:pos]
     }
     pos = strings.Index(second, " #")
     if pos > -1 {
       second = second[0:pos]
     }
     pos = strings.Index(second, "\t//")
     if pos > -1 {
       second = second[0:pos]
     }
     pos = strings.Index(second, " //")
     if pos > -1 {
       second = second[0:pos]
     }
     if len(second) == 0 {
       continue
     }
     key := c.strcet + "=" + frist
     c.Mymap[key] = strings.TrimSpace(second)
   }
}
func (c Config) Read(node, key string) string {
   key = node + "=" + key
   v, found := c.Mymap[key]
   if !found {
     return ""
   }
   return v
}

ftp上传文件核心代码 。

daos_ftp.go 。

?
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package daosftp
import (
   "fmt"
   "net"
   "os"
   "strings"
   ftp "github.com/ftp"
   "io/ioutil"
   "regexp"
   "path/filepath"
   cfg "bjdaos_tool/pkg/daosconfig"
   "bjdaos_tool/pkg/env"
   "bjdaos_tool/pkg/daoslog"
)
func getListDir(dirPth string) (files []string,files1 []string, err error) {
   dir, err := ioutil.ReadDir(dirPth)
   if err != nil {
     return nil,nil, err
   }
   PthSep := string(os.PathSeparator)
   for _, fi := range dir {
     if fi.IsDir() {
       files1 = append(files1, dirPth+PthSep+fi.Name())
       getListDir(dirPth + PthSep + fi.Name())
     }else{
       files = append(files, dirPth+PthSep+fi.Name())
     }
   }
   return files,files1, nil
}
func GetAllFileName(path string, str string) (int, []string ) {
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   logPrint := ftpConfig.Read("file", "log_print")
   files, _, err := getListDir(path)
   if err != nil {
     daoslog.WriteLog(logPrint, "System","get file path err")
   }
   fileLen := len(files)
   fileSlice := make([]string,0, fileLen)
   suffix1 := ftpConfig.Read("file", "file_img")
   suffix2 := ftpConfig.Read("file", "file_xml")
   reg_front := regexp.MustCompile("\\d{8}")
   reg_end := regexp.MustCompile("\\d{14}")
   if str == suffix1{
     for i := 0; i < fileLen; i++{
       data_front := reg_front.FindString(files[i])
       date_end := reg_end.FindString(files[i])
       imgName := data_front + "_" + date_end + str
       fileSlice = append(fileSlice, imgName)
     }
   }else if str == suffix2 {
     for i := 0; i < fileLen; i++{
       data_front := reg_front.FindString(files[i])
       date_end := reg_end.FindString(files[i])
       imgName := data_front + "_" + date_end + str
       fileSlice = append(fileSlice, imgName)
     }
   }
   return fileLen, fileSlice
}
func getLocalIpAddr() string {
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   logPrint := ftpConfig.Read("file", "log_print")
   network := ftpConfig.Read("ftp", "comm_way")
   ip := ftpConfig.Read("ftp", "local_ip")
   port := ftpConfig.Read("ftp", "local_port")
   address := ip + ":" + port
   conn, err := net.Dial(network, address)
   if err != nil {
     daoslog.WriteLog(logPrint, "System", "get local ip address err")
     return "127.0.0.1"
   }
   defer conn.Close()
   return strings.Split(conn.LocalAddr().String(), ":")[0]
}
func ftpUploadFile(ftpserver, ftpuser, pw, localFile, remoteSavePath, saveName string) {
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   logPrint := ftpConfig.Read("file", "log_print")
   ftpfile_path := ftpConfig.Read("ftp", "ftpfile_path")
   ftp, err := ftp.Connect(ftpserver)
   if err != nil {
     daoslog.WriteLog(logPrint, "System", "connect err")
   }
   err = ftp.Login(ftpuser, pw)
   if err != nil {
     daoslog.WriteLog(logPrint, "System", "Login err")
   }
   ftp.ChangeDir(ftpfile_path)
   dir, err := ftp.CurrentDir()
   ftp.MakeDir(remoteSavePath)
   ftp.ChangeDir(remoteSavePath)
   dir, _ = ftp.CurrentDir()
   daoslog.WriteLog(logPrint, "System", dir)
   file, err := os.Open(localFile)
   if err != nil {
     daoslog.WriteLog(logPrint, "System", "Open err")
   }
   defer file.Close()
   err = ftp.Stor(saveName, file)
   if err != nil {
     daoslog.WriteLog(logPrint, "System", "Stor err")
   }
   ftp.Logout()
   ftp.Quit()
   logcotent := fmt.Sprintf("%s:%s","success upload file",localFile)
   daoslog.WriteLog(logPrint, "System", logcotent)
}
func RemoveFile(filePath string, fileName string){
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   logPrint := ftpConfig.Read("file", "log_print")
   err := os.Remove(filePath + fileName)
   if err != nil {
     daoslog.WriteLog("false", "System", "file remove err!")
   } else {
     logcotent := fmt.Sprintf("%s:%s","file remove OK!",fileName)
     daoslog.WriteLog(logPrint, "System", logcotent)
   }
}
func SendXmlFileToFtpServer(filePath string, fileType string) {
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   logPrint := ftpConfig.Read("file", "log_print")
   flen, fileName := GetAllFileName(filePath, fileType)
   serverIp := getLocalIpAddr()
   ftpserverip := ftpConfig.Read("ftp", "ftp_server_ip")
   ftpPort := ftpConfig.Read("ftp", "ftp_server_port")
   ftpuser := ftpConfig.Read("ftp", "ftp_server_name")
   pw := ftpConfig.Read("ftp", "ftp_server_pwd")
   ftpserver := ftpserverip + ":" + ftpPort
   filepath.Walk(filePath, func(path string, f os.FileInfo, err error) error {
     if f == nil {
       return err
     }
     if f.IsDir() {
       return nil
     }
     for i := 0; i < flen; i++{
       if f.Name() == fileName[i] {
         logcotent := fmt.Sprintf("path=",path)
         daoslog.WriteLog(logPrint, "System", logcotent)
         pathFields := strings.Split(path, "\\")
         var domainName string
         if len(pathFields) > 3 {
           domainName = pathFields[len(pathFields)-3]
         }
         ftpUploadFile(ftpserver, ftpuser, pw, path, domainName, serverIp+"_"+fileName[i])
         RemoveFile(filePath, fileName[i])
       }
     }
     return nil
   })
}
func SendJpgFileToFtpServer(filePath string, fileType string) {
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   logPrint := ftpConfig.Read("file", "log_print")
   flen, fileName := GetAllFileName(filePath, fileType)
   serverIp := getLocalIpAddr()
   ftpserverip := ftpConfig.Read("ftp", "ftp_server_ip")
   ftpPort := ftpConfig.Read("ftp", "ftp_server_port")
   ftpuser := ftpConfig.Read("ftp", "ftp_server_name")
   pw := ftpConfig.Read("ftp", "ftp_server_pwd")
   ftpserver := ftpserverip + ":" + ftpPort
   filepath.Walk(filePath, func(path string, f os.FileInfo, err error) error {
     if f == nil {
       return err
     }
     if f.IsDir() {
       return nil
     }
     for i := 0; i < flen; i++{
       if f.Name() == fileName[i] {
         logcotent := fmt.Sprintf("path=",path)
         daoslog.WriteLog(logPrint, "System", logcotent)
         pathFields := strings.Split(path, "\\")
         var domainName string
         if len(pathFields) > 3 {
           domainName = pathFields[len(pathFields)-3]
         }
         ftpUploadFile(ftpserver, ftpuser, pw, path, domainName, serverIp+"_"+fileName[i])
         RemoveFile(filePath, fileName[i])
       }
     }
     return nil
   })
}

打日志的代码 。

daos_log.go 。

?
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
package daoslog
import (
   "fmt"
   "log"
   "os"
   "github.com/golang/glog"
   "time"
   "bjdaos_tool/pkg/env"
)
func WriteLog(islog, logtype , errcontent string) {
   if islog == "false" {
     return
   }
   if logtype != "Info" && logtype!= "Debug" && logtype!= "Error" && logtype != "System" {
     glog.Error("this is not a logtype ")
     return
   }
   data := time.Now().Format("20060102")
   logPath := env.GetConLogPath()
   logFilea := logPath + "\\" + data+"_"+ logtype+".log"
   errcontent = "[" +errcontent + "]"
   logFile, err := os.OpenFile(logFilea, os.O_RDWR | os.O_CREATE, 0777)
   if err != nil {
     fmt.Printf("open file error=%s\r\n", err.Error())
     os.Exit(-1)
   }
   logger := log.New(logFile, "{"+logtype+"} ", log.Ldate | log.Ltime | log.Lshortfile)
   logger.Println(errcontent)
}

路径处理代码 。

daos-evn.go 。

  。

?
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
package env
import (
   "os"
   "runtime"
)
var ostype = runtime.GOOS
func GetProjectPath() string{
   var projectPath string
   projectPath, _ = os.Getwd()
   return projectPath
}
func GetConfigPath() string{
   path := GetProjectPath()
   if ostype == "windows"{
     path = path + "\\" + "config\\"
   }else if ostype == "linux"{
     path = path +"/" + "config/"
   }
   return path
}
func GetConLogPath() string{
   path := GetProjectPath()
   if ostype == "windows"{
     path = path + "\\log\\"
   }else if ostype == "linux"{
     path = path + "/log/"
   }
   return path
}

4、总结 。

主函数:

main.go 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import (
   "bjdaos_tool/pkg/daosftp"
   "bjdaos_tool/pkg/env"
   cfg "bjdaos_tool/pkg/daosconfig"
)
func main(){
   configPath := env.GetConfigPath()
   ftpConfig := new(cfg.Config)
   ftpConfig.InitConfig(configPath + "\\config.ini")
   xml_path := ftpConfig.Read("path", "xml_path")
   img_path := ftpConfig.Read("path", "img_path")
   file_img := ftpConfig.Read("file", "file_img")
   file_xml := ftpConfig.Read("file", "file_xml")
   for{
     daosftp.SendXmlFileToFtpServer(xml_path, file_xml)
     daosftp.SendJpgFileToFtpServer(img_path, file_img)
   }
}

本项目依赖包:

golang实现ftp实时传输文件的案例

完整代码:https://github.com/guoshijiang/go_ftp 。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.

原文链接:https://blog.csdn.net/jiang_xinxing/article/details/72083981 。

最后此篇关于golang实现ftp实时传输文件的案例的文章就讲到这里了,如果你想了解更多关于golang实现ftp实时传输文件的案例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com