package logic import ( "context" "errors" "fmt" "io" "mime/multipart" "strings" "time" "slow_wild_api/apps/internal/svc" "slow_wild_api/apps/internal/types" "slow_wild_api/apps/internal/utils" "github.com/tencentyun/cos-go-sdk-v5" "github.com/zeromicro/go-zero/core/logx" ) type AttachmentUploadLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewAttachmentUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AttachmentUploadLogic { return &AttachmentUploadLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *AttachmentUploadLogic) AttachmentUpload(fileIO multipart.File, header *multipart.FileHeader) (resp *types.BaseReturnData, err error) { resp = &types.BaseReturnData{} contentData, err := io.ReadAll(fileIO) if err != nil { return } // 读取文件的流,用文件流加密成MD5, 如果文件不更改的话MD5不变,减少cos使用 fileName := utils.Str2MD5(contentData, "paopao-im-aghbslsghslk346300basbdja2313241") oldFileName := header.Filename splits := strings.Split(oldFileName, ".") if len(splits) < 2 { err = errors.New("文件上传失败") return } fileName += "." + splits[len(splits)-1] year := time.Now().Year() month := time.Now().Month() path := fmt.Sprintf("%d/%d/%s", year, month, fileName) objectAclOption := &cos.ObjectPutOptions{} _, err = l.svcCtx.TencentCos.Object.Put(l.ctx, path, strings.NewReader(string(contentData)), objectAclOption) if err != nil { return } resp.Data = map[string]string{ "url": fmt.Sprintf("%s/%s", l.svcCtx.TencentCos.BaseURL.BucketURL, path), } return }