一、项目简介

本项目主要实现的功能是ftp客户端不断地将xml文件和jpg文件实时地上传到服务器,当然也可以是其他格式的文件。每当ftp客户端取到一个文件之后,将文件上传到服务器后,然后将其删除。项目实现可配置,如果开发者有类似的需求,只需要修改配置文件就可以使用本项目去完成上传文件的功能。本项目打日志是按照当天时间来生成日志文件,每天每一种类型的日志只打一个文件。

二、项目结构图片

三、项目代码

config配置中的代码

config.ini

[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服务器的IPftp_server_port  = 21                     # ftp服务器的端口ftp_server_name  = 20123762               # ftp服务器的用户名ftp_server_pwd   = 123456                 # ftp服务器的密码local_ip         = 192.168.56.1           # 本地主机的IPlocal_port       = 80                     #本地主机端口comm_way         = udp                    #ftp的通信方式
[file]file_img         =.jpg                    #文件后缀为imgfile_xml         =.xml                    #文件后缀为xmllog_print        = ture                   #是否打日志,生产环境上不打日志,在调式程序的时候使用
读配置文件的代码

daos_config.go

package daosconfigimport ("bufio""io""os""strings"
)type Config struct {Mymap  map[string]stringstrcet 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 + "=" + fristc.Mymap[key] = strings.TrimSpace(second)}
}func (c Config) Read(node, key string) string {key = node + "=" + keyv, found := c.Mymap[key]if !found {return ""}return v
}
ftp上传文件核心代码

daos_ftp.go

package daosftpimport ("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 + strfileSlice = 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 + strfileSlice = 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 + ":" + portconn, 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 + ":" + ftpPortfilepath.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 stringif 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 + ":" + ftpPortfilepath.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 stringif 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

package daoslogimport ("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

package env
import ("os""runtime"
)var ostype = runtime.GOOSfunc GetProjectPath() string{var projectPath stringprojectPath, _ = 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
}

四、总结

主函数:
main.go

package mainimport ("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实时传输文件相关推荐

  1. goudp文件传输服务器,golang实现ftp实时传输文件的案例

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

  2. linux终端传文件,如何使用Linux FTP命令传输文件

    FTP(文件传输协议)是一种标准的网络协议,用于在远程网络之间传输文件. 在本教程中,我们将通过实际示例向您展示如何使用Linux ftp命令. 在大多数情况下,您将使用桌面FTP客户端连接到远程服务 ...

  3. Linux使用ftp传输10g的文件,Ubuntu 16.04 安装ftp服务器传输文件

    最近在搞深度学习,老师比较宝贝他的服务器,要求我以后负责管理服务器.往后所有要使用服务器的人都必须向我申请账号,然后只允许客户端访问,使用文件传输软件传输文件.像我这样一个Linux菜逼,这种要求不是 ...

  4. FTP服务器传输文件

    FTP协议虚拟机与宿主机文件传输 文件传输方式: 1. U盘拷贝 2. 网络传输 FTP:File Transfer Protocol ,文件传输协议 SSH ( SFTP, scp ) NFS SA ...

  5. FTP远程传输文件操作

    1.与远端建立连接 #ftp ftp>open serverip 使用username.password登录后即可进行FTP操作. 2.目录操作:ls.cd.mkdir.delete(删除一个文 ...

  6. Linux利用FTP服务传输文件(山有木兮木有枝,心悦君兮君不知)

    文章目录 一.FTP协议 二.Linux系统配置FTP协议实现文件传输 实例1:匿名用户 实例2:本地用户访问 一.FTP协议 1.FTP协议简介 与大多数 Internet服务一样,FTP也是一个c ...

  7. 实时传输文件到服务器,如何将数据实时上传到云服务器

    如何将数据实时上传到云服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 华 ...

  8. 计算机一级ftp协议传输,文件传输协议(FTP)必将消亡

    文件传输协议(FTP)在RFC 959中定义,于1985年10月发布.文件传输协议(FTP)被设计成为一个跨平台的.简单且易于实现的协议.文件传输协议(FTP)有一个漫长的演化史,是互联网上最重要的应 ...

  9. linux telnet 传文件命令,telnet 传输文件

    用python创建个临时服务器,发送文件供telnet访问 import socket import base64 port = 10005 filename = 'libcrypto.so.1.0. ...

最新文章

  1. iOS9的新特性以及适配方案
  2. SAP S4HANA精华帖集锦
  3. 【创新培育项目】为什么要组队參加比赛?及如何寻找一个合适的选题?
  4. POJ1988 Cube Stacking
  5. i5 11300h和R5 5600H 参数对比哪个好
  6. mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...
  7. SpringCloud系列-Feign的基本应用
  8. Java编写程序将数据存入Kafka中
  9. 一张图看懂SOA与微服务
  10. 五种经典网页布局设计
  11. 海康摄像头使用RTSP
  12. 推荐几款连字字体,在代码编辑器中启用连字字体(Visual Studio Code)
  13. 20190919-5 代码规范
  14. ubuntu下高通平台模组串口驱动及使用
  15. 亿万美金下打造的3D游戏建模《荒野大镖客》,画面燃爆
  16. 三步走,教你高效管理好团队
  17. 机房的正确布线方法,四招轻松搞定!
  18. Ra1nusb越狱的原理解释与实现方式
  19. 混迹在腾讯微博的知名站长名单
  20. Python 高级编程和异步IO并发编程 --13_4 call_soon,call_at,call_soon_threadsafe

热门文章

  1. python生成20个随机数列表_Python利用random生成一个列表内的随机数
  2. springfox源码_重新认识Swagger和Springfox
  3. 1千多看图猜电视剧电影含图ACCESS数据库
  4. php字符串里含有全角符号,php将字符串中全角字符转换为半角字符_PHP教程
  5. [word] 加密密码忘记了怎么办?
  6. 完成以下程序,并进行调试某班期末考试科目为数学、英语和计算机,有最多不超过30人参加考试。
  7. 基于web的网上考试报名系统
  8. 尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败。
  9. 1.JavaFX 创建窗口
  10. Web端和App端测试的区别