attachmentuploadlogic.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package logic
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "mime/multipart"
  8. "strings"
  9. "time"
  10. "slow_wild_api/apps/internal/svc"
  11. "slow_wild_api/apps/internal/types"
  12. "slow_wild_api/apps/internal/utils"
  13. "github.com/tencentyun/cos-go-sdk-v5"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. type AttachmentUploadLogic struct {
  17. logx.Logger
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewAttachmentUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AttachmentUploadLogic {
  22. return &AttachmentUploadLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx,
  26. }
  27. }
  28. func (l *AttachmentUploadLogic) AttachmentUpload(fileIO multipart.File, header *multipart.FileHeader) (resp *types.BaseReturnData, err error) {
  29. resp = &types.BaseReturnData{}
  30. contentData, err := io.ReadAll(fileIO)
  31. if err != nil {
  32. return
  33. }
  34. // 读取文件的流,用文件流加密成MD5, 如果文件不更改的话MD5不变,减少cos使用
  35. fileName := utils.Str2MD5(contentData, "paopao-im-aghbslsghslk346300basbdja2313241")
  36. oldFileName := header.Filename
  37. splits := strings.Split(oldFileName, ".")
  38. if len(splits) < 2 {
  39. err = errors.New("文件上传失败")
  40. return
  41. }
  42. fileName += "." + splits[len(splits)-1]
  43. year := time.Now().Year()
  44. month := time.Now().Month()
  45. path := fmt.Sprintf("%d/%d/%s", year, month, fileName)
  46. objectAclOption := &cos.ObjectPutOptions{}
  47. _, err = l.svcCtx.TencentCos.Object.Put(l.ctx, path, strings.NewReader(string(contentData)), objectAclOption)
  48. if err != nil {
  49. return
  50. }
  51. resp.Data = map[string]string{
  52. "url": fmt.Sprintf("%s/%s", l.svcCtx.TencentCos.BaseURL.BucketURL, path),
  53. }
  54. return
  55. }