upload_file.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. f1, openErr := file.Open() // 读取文件生成MD5值
  43. if openError != nil || openErr != nil {
  44. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
  45. return "", "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
  46. }
  47. defer f.Close() // 创建文件 defer 关闭
  48. defer f1.Close()
  49. //生成md5值
  50. md5h := md5.New()
  51. io.Copy(md5h, f1)
  52. md5String := hex.EncodeToString(md5h.Sum(nil))
  53. //
  54. out, createErr := os.Create(p)
  55. if createErr != nil {
  56. global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
  57. return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
  58. }
  59. defer out.Close() // 创建文件 defer 关闭
  60. _, copyErr := io.Copy(out, f) // 传输(拷贝)文件
  61. if copyErr != nil {
  62. global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
  63. return "", "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
  64. }
  65. return filepath, filename, md5String, nil
  66. }
  67. //上传文件
  68. func (e *UploadFileService) UploadFile(gameId int, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
  69. //查询数据库记录数
  70. var count int64
  71. //获取最后一条记录
  72. var lastRecord response.UploadFileResponse
  73. var version int
  74. filePath, key, md5String, uploadErr := e.UploadFileFunc(header)
  75. if uploadErr != nil {
  76. panic(err)
  77. }
  78. global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Count(&count)
  79. if count == 0 {
  80. version = 1
  81. } else {
  82. global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Last(&lastRecord)
  83. version = lastRecord.Version + 1
  84. }
  85. s := strings.Split(header.Filename, ".")
  86. f := response.UploadFileResponse{
  87. GameID: gameId,
  88. Url: filePath,
  89. Name: header.Filename,
  90. Tag: s[len(s)-1],
  91. Key: key,
  92. Version: version,
  93. Md5String: md5String,
  94. }
  95. return f, e.Upload(f)
  96. }
  97. //下载文件
  98. func (e *UploadFileService) DownloadFile(gameId int, md5String string) (info response.DownloadFile, err error) {
  99. var file response.UploadFileResponse
  100. var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
  101. //数据库中无记录,即不需要更新
  102. err = global.GVA_DB.Table("upload_file").Where("game_id = ?", gameId).Last(&file).Error
  103. if errors.Is(err, gorm.ErrRecordNotFound) {
  104. info = response.DownloadFile{
  105. Url: "",
  106. Md5String: "",
  107. Flag: false,
  108. }
  109. return info, errors.New("无对应game_id")
  110. }
  111. if file.Md5String == md5String {
  112. info = response.DownloadFile{
  113. Url: "",
  114. Md5String: "",
  115. Flag: false,
  116. }
  117. } else {
  118. fullUrl := prefix + file.Url
  119. info = response.DownloadFile{
  120. Url: fullUrl,
  121. Md5String: file.Md5String,
  122. Flag: true,
  123. }
  124. }
  125. return info, err
  126. }