golang压缩文件/文件夹,然后上传到ftp,可用于定时备份
0 4624

go压缩文件上传到ftp


一、配置文件

./conf/config.ini

        [ftp]    
        ip=127.0.0.1
        port=21
        user=website
        pass=222222
        path=/backup/
        
        [dir]
        dirPath=Z:\
        dirName=web
        zipPath=Z:\
        zipName=zip.zip
        
        [set]
        timeover_h=23


二、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
package main
 
import (
   "fmt"
   "github.com/aWildProgrammer/fconf"
   "github.com/dutchcoders/goftp"
   "github.com/mholt/archiver"
   "os"
   "time"
)
 
type ftpConfig struct {
   ip   string
   port string
   user string
   pass string
   path string
}
 
var fc = new(ftpConfig)
var c *fconf.Config
var ftp *goftp.FTP
var zipfile string
 
func main() {
 
   fmt.Println(time.Now())
 
   initConfig()
 
   timeover()
 
   zipfile=compress()
 
   defer func() {
      fmt.Println("正在删除压缩文件,请稍等...")
      err:=os.Remove(zipfile)
      if err==nil {
         fmt.Println("删除压缩文件完成")
      }else{
         fmt.Println("删除压缩文件失败")
      }
      if err := recover(); err != nil {
         fmt.Println("任务失败,执行终止")
      }
   }()
 
   uploadToFtp(zipfile)
 
   fmt.Println("执行完毕,程序将在3秒后退出")
   time.Sleep(3e9)
}
 
// 读取配置
func initConfig(){
   var err error
   c, err = fconf.NewFileConf("./conf/config.ini")
   if err != nil {
      panic(err)
   }
 
   fc.ip = c.String("ftp.ip")
   fc.port = c.String("ftp.port")
   fc.user = c.String("ftp.user")
   fc.pass = c.String("ftp.pass")
   fc.path = c.String("ftp.path")
}
 
// 压缩目录
func compress() string {
   // 压缩文件
   var re []string
   var des string
   re = append(re, c.String("dir.dirPath")+c.String("dir.dirName"))
   des=c.String("dir.zipPath")+c.String("dir.zipName")
   fmt.Println("正在检测同名文件,请稍等...")
   // 处理同名压缩包文件
   var exist_bak bool false
   _, err := os.Stat(des+".bak")
   if err == nil {
      fmt.Println("存在同名压缩包的bak文件")
      exist_bak=true
   }
   _, err = os.Stat(des)
   if err == nil {
      if exist_bak {
         fmt.Println("正在移除同名文件,请稍等...")
         os.Remove(des)
      }else{
         fmt.Println("正在重命名同名文件,请稍等...")
         os.Rename(des,des+".bak")
      }
   }
 
   fmt.Println("正在压缩文件,请稍等...")
   err = archiver.Archive(re, des)
   if err != nil {
      fmt.Println("压缩文件失败,程序将在3秒后退出",re,des)
      time.Sleep(3e9)
      panic("")
   }
   return des
}
 
// 上传ftp
func uploadToFtp(file string){
   // ftp
   fmt.Println("正在连接FTP...")
   ftp, err := goftp.Connect(fc.ip + ":" + fc.port)
 
   if err != nil {
      fmt.Println("连接FTP失败")
      panic("")
   }
 
   fmt.Println("正在登录...")
   err = ftp.Login(fc.user, fc.pass)
   if err != nil {
      fmt.Println("登录失败")
      panic("")
   }
 
   fmt.Println("正在切换目录...")
   err = ftp.Cwd(fc.path)
   if err != nil {
      fmt.Println("切换目录失败")
      panic("")
   }
 
   fmt.Println("检测日期文件夹是否存在...")
   now:=time.Now()
   day:=now.Format("2006-01-02")
   err = ftp.Cwd(fc.path+day)
   if err == nil {
      fmt.Println("当前日期文件夹已存在")
      panic("")
   }
 
   fmt.Println("正在创建日期文件夹...")
   err=ftp.Mkd(day)
   if err != nil {
      fmt.Println("创建日期文件夹失败")
      panic("")
   }
 
   fmt.Println("正在切换日期文件夹目录...")
   err = ftp.Cwd(fc.path+day)
   if err != nil {
      fmt.Println("切换日期文件夹目录失败")
      panic("")
   }
 
 
 
   fmt.Println("正在上传文件...")
   err = ftp.Upload(file)
   if err != nil {
      fmt.Println("上传文件失败")
      panic(err)
   }
   fmt.Println("上传文件成功")
 
   ftp.Close()
}
 
 
// 超时终止退出,未处理未上传完的情况
func timeover() {
   h,_:=c.Int("set.timeover_h")
   s:=time.Duration(h * 60 * 60 * 1e9)
   timer1 := time.NewTimer(s)
   go func(t *time.Timer) {
      for {
         <-t.C
 
         fmt.Println("程序超时,将自动退出")
 
         fmt.Println("超时处理,正在断开ftp,请稍等...")
         ftp.Close()
 
         fmt.Println("超时处理,正在删除压缩文件,请稍等...")
         err:=os.Remove(zipfile)
         if err==nil {
            fmt.Println("超时处理,删除压缩文件完成")
         }else{
            fmt.Println("超时处理,删除压缩文件失败")
         }
         fmt.Println("任务失败,执行超时")
         timer1.Stop()
         os.Exit(0)
      }
   }(timer1)
}


 评论
 站内搜索