golang文件自动上传
1. 最近由于在写论文,论文有时候没有保存,还会担心文件丢失等问题,觉得不如写一个脚本,定时上传到服务器,有备无患
1首先肯定是定时的去上传文件,请求方式肯定是POST请求,数据格式采用 multipart/form-data
形式,先完成定时任务,这个定时任务的时间最好我们能自己设置(比如多少分钟上传一次)
core函数实现定时任务
func core(t time.Duration) {
log.Printf("任务启动,间隔 %v 上传一次", t)
times := time.NewTicker(t)
for {
select {
case date := <-times.C:
// 执行上传
log.Println("开始上传", date.Format(time.DateTime))
err := upload(filePath)
if err != nil {
// 处理错误
log.Println("上传出错 err:", err)
return
}
log.Println("结束上传", time.Now().Format(time.DateTime))
log.Printf("耗时:%v 秒", time.Now().Sub(date).Seconds())
log.Printf("距离下次上传 %v 分钟", t.Minutes())
}
}
}
2 接下来是最重要的上传
upload函数实现上传
func upload(filePath string) error {
// 文件
url := "api接口,这个需要自己实现"
// 创建表单
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
file, err := os.Open(filePath)
if err != nil {
return err
}
part, err := writer.CreateFormFile("file", filepath.Base(filePath))
if err != nil {
return err
}
_, err = io.Copy(part, file)
if err != nil {
return err
}
writer.Close()
file.Close()
resp, err := http.Post(url, writer.FormDataContentType(), body)
if err != nil {
return err
}
_, err = io.ReadAll(resp.Body)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode == 200 {
log.Println("上传文件成功")
}
return nil
}
3主函数
var duration int
var filePath string
func main() {
flag.StringVar(&filePath, "filePath", "默认的论文的绝对路径", "论文的路径")
flag.IntVar(&duration, "duration", 20, "多久提交一次")
// 解析命令行参数
flag.Parse()
dir := filepath.Dir(filePath)
fielename := filepath.Base(filePath)
filePath = dir + "\\" + fielename
fmt.Println(filePath)
t := time.Minute * time.Duration(duration)
core(t)
}
4打包为exe文件(window)平台
go build -o upload.exe -ldflags "-s -w"
5 执行
//10分钟执行一次
.\upload.exe -duration 10