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