| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package task
- import (
- "crypto/md5"
- "encoding/hex"
- "errors"
- "go.uber.org/zap"
- "gorm.io/gorm"
- "io"
- "log-server/global"
- "log-server/model/task/response"
- "log-server/utils"
- "mime/multipart"
- "os"
- "path"
- "strings"
- "time"
- )
- type UploadFileService struct {
- }
- func (e *UploadFileService) Upload(file response.UploadFileResponse) error {
- return global.GVA_DB.Table("upload_file").Create(&file).Error
- }
- //更改的上传文件函数
- func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader) (string, 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() Filed", zap.Any("err", mkdirErr.Error()))
- return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
- }
- // 拼接路径和文件名
- p := global.GVA_CONFIG.Local.StorePath + "/" + filename
- filepath := global.GVA_CONFIG.Local.Path + "/" + filename
- f, openError := file.Open() // 读取文件
- f1, openErr := file.Open() // 读取文件生成MD5值
- if openError != nil || openErr != nil {
- global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
- return "", "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
- }
- defer f.Close() // 创建文件 defer 关闭
- defer f1.Close()
- //生成md5值
- md5h := md5.New()
- io.Copy(md5h, f1)
- md5String := hex.EncodeToString(md5h.Sum(nil))
- //
- out, createErr := os.Create(p)
- if createErr != nil {
- global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
- return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
- }
- defer out.Close() // 创建文件 defer 关闭
- _, copyErr := io.Copy(out, f) // 传输(拷贝)文件
- if copyErr != nil {
- global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
- return "", "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
- }
- return filepath, filename, md5String, nil
- }
- //上传文件
- func (e *UploadFileService) UploadFile(gameId int, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
- //查询数据库记录数
- var count int64
- //获取最后一条记录
- var lastRecord response.UploadFileResponse
- var version int
- filePath, key, md5String, uploadErr := e.UploadFileFunc(header)
- if uploadErr != nil {
- panic(err)
- }
- global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Count(&count)
- if count == 0 {
- version = 1
- } else {
- global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Last(&lastRecord)
- version = lastRecord.Version + 1
- }
- s := strings.Split(header.Filename, ".")
- f := response.UploadFileResponse{
- GameID: gameId,
- Url: filePath,
- Name: header.Filename,
- Tag: s[len(s)-1],
- Key: key,
- Version: version,
- Md5String: md5String,
- }
- return f, e.Upload(f)
- }
- //下载文件
- func (e *UploadFileService) DownloadFile(gameId int, md5String string) (info response.DownloadFile, err error) {
- var file response.UploadFileResponse
- var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
- //数据库中无记录,即不需要更新
- err = global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Last(&file).Error
- if errors.Is(err, gorm.ErrRecordNotFound) {
- info = response.DownloadFile{
- Url: "",
- Md5String: "",
- Flag: false,
- }
- return info, errors.New("无对应game_id")
- }
- if file.Md5String == md5String {
- info = response.DownloadFile{
- Url: "",
- Md5String: "",
- Flag: false,
- }
- } else {
- fullUrl := prefix + file.Url
- info = response.DownloadFile{
- Url: fullUrl,
- Md5String: file.Md5String,
- Flag: true,
- }
- }
- return info, err
- }
|