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) } |