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