package utils

import (
	"gin-vue-admin/global"
	"go.uber.org/zap"
	"io"
	"mime/multipart"
	"os"
	"path"
	"strings"
	"time"
)

func UploadFileLocal(file *multipart.FileHeader) (err error, localPath string, key string) {
	// 读取文件后缀
	ext := path.Ext(file.Filename)
	// 读取文件名并加密
	fileName := strings.TrimSuffix(file.Filename, ext)
	fileName = MD5V([]byte(fileName))
	// 拼接新文件名
	lastName := fileName + "_" + time.Now().Format("20060102150405") + ext
	// 读取全局变量的定义路径
	savePath := global.GVA_CONFIG.Local.Path
	// 尝试创建此路径
	err = os.MkdirAll(savePath, os.ModePerm)
	if err != nil {
		global.GVA_LOG.Error("upload local file fail:", zap.Any("err", err))
		return err, "", ""
	}
	// 拼接路径和文件名
	dst := savePath + "/" + lastName
	// 下面为上传逻辑
	// 打开文件 defer 关闭
	src, err := file.Open()
	if err != nil {
		global.GVA_LOG.Error("upload local file fail:", zap.Any("err", err))
		return err, "", ""
	}
	defer src.Close()
	// 创建文件 defer 关闭
	out, err := os.Create(dst)
	if err != nil {
		global.GVA_LOG.Error("upload local file fail:", zap.Any("err", err))
		return err, "", ""
	}
	defer out.Close()
	// 传输(拷贝)文件
	_, err = io.Copy(out, src)
	if err != nil {
		global.GVA_LOG.Error("upload local file fail:", zap.Any("err", err))
		return err, "", ""
	}
	return nil, dst, lastName
}