upload_file.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package task
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "errors"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. "io"
  9. "log-server/global"
  10. "log-server/model/task/response"
  11. "log-server/utils"
  12. "mime/multipart"
  13. "os"
  14. "path"
  15. "strings"
  16. "time"
  17. )
  18. type UploadFileService struct {
  19. }
  20. func (e *UploadFileService) Upload(file response.UploadFileResponse) error {
  21. return global.GVA_DB.Table("upload_file").Create(&file).Error
  22. }
  23. //更改的上传文件函数
  24. func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader) (string, string, string, error) {
  25. // 读取文件后缀
  26. ext := path.Ext(file.Filename)
  27. // 读取文件名并加密
  28. name := strings.TrimSuffix(file.Filename, ext)
  29. name = utils.MD5V([]byte(name))
  30. // 拼接新文件名
  31. filename := name + "_" + time.Now().Format("20060102150405") + ext
  32. // 尝试创建此路径
  33. mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.StorePath, os.ModePerm)
  34. if mkdirErr != nil {
  35. global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
  36. return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
  37. }
  38. // 拼接路径和文件名
  39. p := global.GVA_CONFIG.Local.StorePath + "/" + filename
  40. filepath := global.GVA_CONFIG.Local.Path + "/" + filename
  41. f, openError := file.Open() // 读取文件
  42. if openError != nil {
  43. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
  44. return "", "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
  45. }
  46. defer f.Close() // 创建文件 defer 关闭
  47. //生成md5值
  48. md5h := md5.New()
  49. io.Copy(md5h, f)
  50. md5String := hex.EncodeToString(md5h.Sum(nil))
  51. //
  52. out, createErr := os.Create(p)
  53. if createErr != nil {
  54. global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
  55. return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
  56. }
  57. defer out.Close() // 创建文件 defer 关闭
  58. _, copyErr := io.Copy(out, f) // 传输(拷贝)文件
  59. if copyErr != nil {
  60. global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
  61. return "", "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
  62. }
  63. return filepath, filename, md5String, nil
  64. }
  65. //上传文件
  66. func (e *UploadFileService) UploadFile(gameId int, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
  67. //查询数据库记录数
  68. var count int64
  69. //获取最后一条记录
  70. var lastRecord response.UploadFileResponse
  71. var version int
  72. filePath, key, md5String, uploadErr := e.UploadFileFunc(header)
  73. if uploadErr != nil {
  74. panic(err)
  75. }
  76. global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Count(&count)
  77. if count == 0 {
  78. version = 1
  79. } else {
  80. global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Last(&lastRecord)
  81. version = lastRecord.Version + 1
  82. }
  83. s := strings.Split(header.Filename, ".")
  84. f := response.UploadFileResponse{
  85. GameID: gameId,
  86. Url: filePath,
  87. Name: header.Filename,
  88. Tag: s[len(s)-1],
  89. Key: key,
  90. Version: version,
  91. Md5String: md5String,
  92. }
  93. return f, e.Upload(f)
  94. }
  95. //下载文件
  96. func (e *UploadFileService) DownloadFile(gameId int, md5String string) (info response.DownloadFile, err error) {
  97. var file response.UploadFileResponse
  98. //数据库中无记录,即不需要更新
  99. err = global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Last(&file).Error
  100. if errors.Is(err, gorm.ErrRecordNotFound) {
  101. info = response.DownloadFile{
  102. Url: "",
  103. Md5String: "",
  104. Flag: false,
  105. }
  106. return info, nil
  107. }
  108. if file.Md5String == md5String {
  109. info = response.DownloadFile{
  110. Url: "",
  111. Md5String: md5String,
  112. Flag: false,
  113. }
  114. } else {
  115. info = response.DownloadFile{
  116. Url: file.Url,
  117. Md5String: file.Md5String,
  118. Flag: true,
  119. }
  120. }
  121. return info, err
  122. }