upload_file.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package task
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "errors"
  6. "fmt"
  7. "go.uber.org/zap"
  8. "gorm.io/gorm"
  9. "io"
  10. "log-server/global"
  11. "log-server/model/common/request"
  12. "log-server/model/task"
  13. taskReq "log-server/model/task/request"
  14. "log-server/model/task/response"
  15. "log-server/utils"
  16. "mime/multipart"
  17. "os"
  18. "path"
  19. "strings"
  20. "time"
  21. )
  22. type UploadFileService struct {
  23. }
  24. func (e *UploadFileService) Upload(file response.UploadFileResponse) error {
  25. return global.GVA_DB.Table("upload_file").Create(&file).Error
  26. }
  27. //更改的上传文件函数
  28. func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader) (string, string, string, error) {
  29. // 读取文件后缀
  30. ext := path.Ext(file.Filename)
  31. // 读取文件名并加密
  32. name := strings.TrimSuffix(file.Filename, ext)
  33. name = utils.MD5V([]byte(name))
  34. // 拼接新文件名
  35. filename := name + "_" + time.Now().Format("20060102150405") + ext
  36. // 尝试创建此路径
  37. mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.ScriptPath, os.ModePerm)
  38. if mkdirErr != nil {
  39. global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
  40. return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
  41. }
  42. // 拼接路径和文件名
  43. p := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
  44. filepath := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
  45. f, openError := file.Open() // 读取文件
  46. f1, openErr := file.Open() // 读取文件生成MD5值
  47. if openError != nil || openErr != nil {
  48. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
  49. return "", "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
  50. }
  51. defer f.Close() // 创建文件 defer 关闭
  52. defer f1.Close()
  53. //生成md5值
  54. md5h := md5.New()
  55. io.Copy(md5h, f1)
  56. md5String := hex.EncodeToString(md5h.Sum(nil))
  57. //
  58. out, createErr := os.Create(p)
  59. if createErr != nil {
  60. global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
  61. return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
  62. }
  63. defer out.Close() // 创建文件 defer 关闭
  64. _, copyErr := io.Copy(out, f) // 传输(拷贝)文件
  65. fmt.Println("拷贝文件")
  66. if copyErr != nil {
  67. global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
  68. return "", "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
  69. }
  70. return filepath, filename, md5String, nil
  71. }
  72. //上传文件
  73. func (e *UploadFileService) UploadFile(taskId int, user string, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
  74. //查询数据库记录数
  75. var count int64
  76. //获取最后一条记录
  77. var lastRecord response.UploadFileResponse
  78. var version int
  79. //定义下载前缀
  80. var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
  81. filePath, key, md5String, uploadErr := e.UploadFileFunc(header)
  82. if uploadErr != nil {
  83. panic(err)
  84. }
  85. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Count(&count)
  86. if count == 0 {
  87. version = 1
  88. } else {
  89. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Last(&lastRecord)
  90. version = lastRecord.Version + 1
  91. }
  92. s := strings.Split(header.Filename, ".")
  93. f := response.UploadFileResponse{
  94. TaskID: taskId,
  95. ResponsiblePerson: user,
  96. Url: prefix + filePath,
  97. Name: header.Filename,
  98. Tag: s[len(s)-1],
  99. Key: key,
  100. Version: version,
  101. Md5String: md5String,
  102. State : 1,
  103. }
  104. return f, e.Upload(f)
  105. }
  106. //下载文件
  107. func (e *UploadFileService) DownloadFile(taskId int, md5String string) (info response.DownloadFile, err error) {
  108. var file response.UploadFileResponse
  109. //改由存储至数据库的时候拼接前缀
  110. //var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
  111. //数据库中无记录,即不需要更新
  112. err = global.GVA_DB.Table("upload_file").Where("task_id = ? and state = 1", taskId).Last(&file).Error
  113. if errors.Is(err, gorm.ErrRecordNotFound) {
  114. info = response.DownloadFile{
  115. Url: "",
  116. Md5String: "",
  117. Flag: false,
  118. }
  119. return info, errors.New("无对应脚本")
  120. }
  121. if file.Md5String == md5String {
  122. info = response.DownloadFile{
  123. Url: "",
  124. Md5String: "",
  125. Flag: false,
  126. }
  127. } else {
  128. fullUrl := file.Url
  129. info = response.DownloadFile{
  130. Url: fullUrl,
  131. Md5String: file.Md5String,
  132. Flag: true,
  133. }
  134. }
  135. return info, err
  136. }
  137. //条件查询脚本列表
  138. func (e *UploadFileService) GetScriptList(script task.GameScriptResponse, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  139. //获取分页数据
  140. limit := info.PageSize
  141. offset := (info.Page - 1) * info.PageSize
  142. //绑定操作结构体
  143. db := global.GVA_DB.Table("upload_file").Model(&task.GameScriptResponse{})
  144. var scriptList []task.GameScriptResponse
  145. //条件查询
  146. if script.ResponsiblePerson != "" {
  147. db = db.Where("responsible_person = ?", script.ResponsiblePerson)
  148. }
  149. if script.TaskID != 0 {
  150. db = db.Where("task_id = ?", script.TaskID)
  151. }
  152. //先过滤在排序
  153. if err = db.Count(&total).Error; err != nil {
  154. return scriptList, total, err
  155. } else {
  156. //分页
  157. db.Limit(limit).Offset(offset)
  158. //判断是否有排序字段
  159. if order != "" {
  160. var orderStr string
  161. orderMap := make(map[string]bool, 1)
  162. orderMap["create_time"] = true
  163. orderMap["task_id"] = true
  164. orderMap["name"] = true
  165. orderMap["responsible_person"] = true
  166. if orderMap[order] {
  167. //合法排序字符
  168. if desc {
  169. orderStr = order + " desc"
  170. } else {
  171. orderStr = order
  172. }
  173. } else {
  174. //传入排序字段非法
  175. err = fmt.Errorf("传入非法字段 %v", order)
  176. return scriptList, total, err
  177. }
  178. err = db.Order(orderStr).Find(&scriptList).Error
  179. } else {
  180. //默认按照名字升序排序
  181. err = db.Order("name").Find(&scriptList).Error
  182. }
  183. }
  184. return scriptList, total, err
  185. }
  186. //更改脚本状态
  187. func (e *UploadFileService) UpdateScriptStatus(c taskReq.UpdateScriptStatusRequest) (err error) {
  188. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Error
  189. if errors.Is(err, gorm.ErrRecordNotFound) {
  190. return errors.New("请传入正确的Id")
  191. }
  192. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Update("state", c.State).Error
  193. return err
  194. }