87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
|
package upload
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io"
|
||
|
"mime/multipart"
|
||
|
"os"
|
||
|
"path"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"go.uber.org/zap"
|
||
|
"miniapp/global"
|
||
|
"miniapp/utils"
|
||
|
)
|
||
|
|
||
|
type Local struct{}
|
||
|
|
||
|
//@author: [piexlmax](https://github.com/piexlmax)
|
||
|
//@author: [ccfish86](https://github.com/ccfish86)
|
||
|
//@author: [SliverHorn](https://github.com/SliverHorn)
|
||
|
//@object: *Local
|
||
|
//@function: UploadFile
|
||
|
//@description: 上传文件
|
||
|
//@param: file *multipart.FileHeader
|
||
|
//@return: string, string, error
|
||
|
|
||
|
func (*Local) UploadFile(file *multipart.FileHeader) (string, string, error) {
|
||
|
// 读取文件后缀
|
||
|
ext := path.Ext(file.Filename)
|
||
|
// 读取文件名并加密
|
||
|
name := strings.TrimSuffix(file.Filename, ext)
|
||
|
name = utils.MD5V([]byte(name))
|
||
|
// 拼接新文件名
|
||
|
filename := name + "_" + time.Now().Format("20060102150405") + ext
|
||
|
// 尝试创建此路径
|
||
|
mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.StorePath, os.ModePerm)
|
||
|
if mkdirErr != nil {
|
||
|
global.GVA_LOG.Error("function os.MkdirAll() failed", zap.Any("err", mkdirErr.Error()))
|
||
|
return "", "", errors.New("function os.MkdirAll() failed, err:" + mkdirErr.Error())
|
||
|
}
|
||
|
// 拼接路径和文件名
|
||
|
p := global.GVA_CONFIG.Local.StorePath + "/" + filename
|
||
|
filepath := global.GVA_CONFIG.Local.Path + "/" + filename
|
||
|
|
||
|
f, openError := file.Open() // 读取文件
|
||
|
if openError != nil {
|
||
|
global.GVA_LOG.Error("function file.Open() failed", zap.Any("err", openError.Error()))
|
||
|
return "", "", errors.New("function file.Open() failed, err:" + openError.Error())
|
||
|
}
|
||
|
defer f.Close() // 创建文件 defer 关闭
|
||
|
|
||
|
out, createErr := os.Create(p)
|
||
|
if createErr != nil {
|
||
|
global.GVA_LOG.Error("function os.Create() failed", zap.Any("err", createErr.Error()))
|
||
|
|
||
|
return "", "", errors.New("function os.Create() failed, err:" + createErr.Error())
|
||
|
}
|
||
|
defer out.Close() // 创建文件 defer 关闭
|
||
|
|
||
|
_, copyErr := io.Copy(out, f) // 传输(拷贝)文件
|
||
|
if copyErr != nil {
|
||
|
global.GVA_LOG.Error("function io.Copy() failed", zap.Any("err", copyErr.Error()))
|
||
|
return "", "", errors.New("function io.Copy() failed, err:" + copyErr.Error())
|
||
|
}
|
||
|
return filepath, filename, nil
|
||
|
}
|
||
|
|
||
|
//@author: [piexlmax](https://github.com/piexlmax)
|
||
|
//@author: [ccfish86](https://github.com/ccfish86)
|
||
|
//@author: [SliverHorn](https://github.com/SliverHorn)
|
||
|
//@object: *Local
|
||
|
//@function: DeleteFile
|
||
|
//@description: 删除文件
|
||
|
//@param: key string
|
||
|
//@return: error
|
||
|
|
||
|
func (*Local) DeleteFile(key string) error {
|
||
|
p := global.GVA_CONFIG.Local.StorePath + "/" + key
|
||
|
if strings.Contains(p, global.GVA_CONFIG.Local.StorePath) {
|
||
|
if err := os.Remove(p); err != nil {
|
||
|
return errors.New("本地文件删除失败, err:" + err.Error())
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|