自动更新管控端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
2.7 KiB

package core
import (
"fmt"
"fss/config"
"fss/util"
"io"
"mime"
"net/http"
"os"
"path/filepath"
"strings"
"time"
)
// 接收发送来的文件
func ReceiveHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
//
fmt.Fprintf(w, "%s:接收文件中...", r.Host)
case http.MethodPost:
// receive file and save
file, header, err := r.FormFile("file")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer file.Close()
_, params, err := mime.ParseMediaType(header.Header.Get("Content-Disposition"))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
filename := filepath.FromSlash(params["filename"])
// fpath
bfpath := r.Header.Get("Fpath")
//debug
// fmt.Printf("header params:%v\n", r.Header)
fmt.Printf("fpath is:%s,afbs64 is:%s\n", bfpath, util.Base64dec(bfpath))
fmt.Printf("Downloading [%s]...\n", filename)
// 拼装完整路径
nfname := filepath.Join(config.G.FilePath, util.Base64dec(bfpath))
dirPath := filepath.Dir(nfname)
//dirPath := filepath.Dir(filename)
err = os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 检查文件是否存在
if util.IsFileExist(nfname) {
// 当前时间
curtime := time.Now().Format("2006/01/02")
// 创建备份文件夹
bkdir := filepath.Join(config.G.FilePath, "backup", curtime)
// 递归创建文件夹
serr := os.MkdirAll(bkdir, os.ModePerm)
// 创建错误 返回空
if serr != nil {
return
}
// 文件重命名
//ddname := filename + "_backup_" + time.Now().Format("20060102150405")
ddname := filename + "_backup_" + time.Now().Format("20060102150405")
// 文件移动到备份目录下,并做压缩包
bkzip := filepath.Join(bkdir, ddname)
zfarr := []string{nfname}
util.ZipFiles(bkzip+".zip", zfarr, bkdir)
//渠道
// 加上路径
fnewname := filepath.Join(bkdir, ddname)
os.Rename(nfname, fnewname)
}
out, err := os.Create(nfname)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 如果单文件,需要先备份
// 如果收到的是zip文件,自动给解压缩
suf := strings.Split(filename, ".")
if suf[1] == "zip" {
// 传入实际路径
go util.DecompressZip(nfname)
}
fmt.Printf("[√] Download [%s] Success.\n", filename)
//
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
// 输出接收结果
// fmt.Fprintf(w, "接收成功,并已经完成解压缩")
}