diff --git a/server/upload/internal/logic/uploadfilesbackendlogic.go b/server/upload/internal/logic/uploadfilesbackendlogic.go index a0fba113..eb1a546a 100644 --- a/server/upload/internal/logic/uploadfilesbackendlogic.go +++ b/server/upload/internal/logic/uploadfilesbackendlogic.go @@ -2,22 +2,18 @@ package logic import ( "encoding/json" - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "fusenapi/utils/file" "fusenapi/utils/hash" "io" "net/http" - "time" "context" "fusenapi/server/upload/internal/svc" "fusenapi/server/upload/internal/types" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/s3" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/mr" ) @@ -101,16 +97,6 @@ func (l *UploadFilesBackendLogic) UploadFilesBackend(req *types.UploadFilesReq, //获取上传的文件组 files := l.r.MultipartForm.File["file"] - // 设置AWS会话的区域 - l.svcCtx.AwsSession.Config.Region = aws.String("us-west-1") - - // 创建新的S3服务实例 - svc := s3.New(l.svcCtx.AwsSession) - - // 定义S3请求和当前时间 - var s3req *request.Request - - resourceModel := gmodel.NewFsResourceModel(l.svcCtx.MysqlConn) result, err := mr.MapReduce(func(source chan<- interface{}) { for i, info := range uploadInfoList { fileType := files[i].Header.Get("Content-Type") @@ -148,60 +134,28 @@ func (l *UploadFilesBackendLogic) UploadFilesBackend(req *types.UploadFilesReq, uploadUrl.ResourceType = uploadDataInfo.FileType var resourceId string = uploadDataInfo.HashKey - // 查询数据库 - resourceInfo, err := resourceModel.FindOneById(l.ctx, resourceId) - if err == nil && resourceInfo.ResourceId != "" { - uploadUrl.Status = 1 - uploadUrl.ResourceId = resourceId - uploadUrl.ResourceUrl = *resourceInfo.ResourceUrl - } else { - // 创建S3对象存储请求 - s3req, _ = svc.PutObjectRequest( - &s3.PutObjectInput{ - Bucket: uploadDataInfo.Bucket, - Key: &uploadDataInfo.HashKey, - }, - ) - // 设置请求体为文件数据 - s3req.SetBufferBody(uploadDataInfo.FileData) - - // 发送请求 - err = s3req.Send() - // 检查是否有错误 - if err != nil { - logx.Error(err) - uploadUrl.Status = 0 - } else { - contentType := http.DetectContentType(uploadDataInfo.FileData) - var url = s3req.HTTPRequest.URL.String() - // 打印请求URL - logx.Info(url) - uploadUrl.Status = 1 - uploadUrl.ResourceId = resourceId - uploadUrl.ResourceUrl = url - var version string = "0.0.1" - var nowTime = time.Now() - _, err = resourceModel.Create(l.ctx, &gmodel.FsResource{ - ResourceId: resourceId, - UserId: &userId, - GuestId: &guestId, - ResourceType: &contentType, - ResourceUrl: &url, - Version: &version, - UploadedAt: &nowTime, - Metadata: &uploadDataInfo.Metadata, - ApiType: &uploadDataInfo.ApiType, - BucketName: bucketName, - }) - if err != nil { - logx.Error(err) - } - } + // 上传文件 + var upload = file.Upload{ + Ctx: l.ctx, + MysqlConn: l.svcCtx.MysqlConn, + AwsSession: l.svcCtx.AwsSession, + } + uploadRes, err := upload.UploadFileByByte(&file.UploadBaseReq{ + FileHash: resourceId, + FileByte: uploadDataInfo.FileData, + UploadBucket: 1, + ApiType: 2, + UserId: userId, + GuestId: guestId, + }) + if err == nil { + uploadUrl.ResourceId = uploadRes.ResourceId + uploadUrl.ResourceType = uploadRes.ResourceType + uploadUrl.ResourceUrl = uploadRes.ResourceUrl + // Notice 这个必须加! + writer.Write(uploadUrl) } - - // Notice 这个必须加! - writer.Write(uploadUrl) }, func(pipe <-chan interface{}, writer mr.Writer[interface{}], cancel func(error)) { var uploadUrlList = make(map[string][]*UploadUrl) var uploadUrlListFail []*UploadUrl @@ -235,7 +189,6 @@ type UploadInfo struct { FileKeys string `json:"file_keys"` // 上传文件唯一标识 FileData *string `json:"file_data"` // 上传文件Base64 Metadata string `json:"meta_data"` // 上传文件额外信息 - } type UploadData struct { diff --git a/utils/file/upload.go b/utils/file/upload.go index 2596b14e..0038ed1c 100644 --- a/utils/file/upload.go +++ b/utils/file/upload.go @@ -4,6 +4,7 @@ import ( "context" "fusenapi/model/gmodel" "fusenapi/utils/basic" + "net/http" "time" "github.com/aws/aws-sdk-go/aws" @@ -28,6 +29,7 @@ type UploadBaseReq struct { ApiType int64 UserId int64 GuestId int64 + FileByte []byte } type UploadBaseRes struct { @@ -133,3 +135,92 @@ func (upload *Upload) UploadFileByBase64(req *UploadBaseReq) (*UploadBaseRes, er return &uploadBaseRes, err } + +func (upload *Upload) UploadFileByByte(req *UploadBaseReq) (*UploadBaseRes, error) { + // 定义存储桶名称 + var bucketName *string + var apiType int64 = req.ApiType + + // 根据类别选择存储桶 + switch req.UploadBucket { + case 2: + bucketName = basic.TempfileBucketName + default: + bucketName = basic.StorageBucketName + } + + // 设置AWS会话的区域 + upload.AwsSession.Config.Region = aws.String("us-west-1") + + // 创建新的S3服务实例 + svc := s3.New(upload.AwsSession) + + // 定义S3请求和当前时间 + var s3req *request.Request + + var resourceId string = req.FileHash + + var uploadBaseRes = UploadBaseRes{} + resourceModel := gmodel.NewFsResourceModel(upload.MysqlConn) + err := resourceModel.Trans(upload.Ctx, func(ctx context.Context, connGorm *gorm.DB) error { + resourceModelTS := gmodel.NewFsResourceModel(connGorm) + resourceInfo, err := resourceModelTS.FindOneById(ctx, resourceId) + if err == nil && resourceInfo.ResourceId != "" { + uploadBaseRes.Status = 1 + uploadBaseRes.ResourceId = resourceId + uploadBaseRes.ResourceUrl = *resourceInfo.ResourceUrl + } else { + contentType := http.DetectContentType(req.FileByte) + // 创建S3对象存储请求 + s3req, _ = svc.PutObjectRequest( + &s3.PutObjectInput{ + Bucket: bucketName, + Key: &resourceId, + }, + ) + + // 设置请求体为文件数据 + s3req.SetBufferBody(req.FileByte) + + // 发送请求 + err = s3req.Send() + + // 检查是否有错误 + if err != nil { + logx.Errorf("err:%+v,desc:%+v", err, "fail.upload.s3req") + return err + } else { + var url = s3req.HTTPRequest.URL.String() + // 打印请求URL + logx.Info(url) + uploadBaseRes.Status = 1 + uploadBaseRes.ResourceId = resourceId + uploadBaseRes.ResourceUrl = url + var version string = "0.0.1" + var nowTime = time.Now() + _, err = resourceModelTS.Create(upload.Ctx, &gmodel.FsResource{ + ResourceId: resourceId, + UserId: &req.UserId, + GuestId: &req.GuestId, + ResourceType: &contentType, + ResourceUrl: &url, + Version: &version, + UploadedAt: &nowTime, + Metadata: &req.Metadata, + ApiType: &apiType, + BucketName: bucketName, + }) + if err != nil { + logx.Errorf("err:%+v,desc:%+v", err, "fail.upload.resourceInfoAdd.mysql") + return err + } + } + } + return nil + }) + if err != nil { + return nil, err + } + + return &uploadBaseRes, err +}