From 7b32eb91547c0f946f33cb1ca9e5ef1b8cb73d88 Mon Sep 17 00:00:00 2001 From: Hiven Date: Wed, 9 Aug 2023 14:58:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=8E=B7=E5=8F=96=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/logic/uploadfilebaselogic.go | 107 ++++------------- utils/file/upload.go | 112 ++++++++++-------- 2 files changed, 83 insertions(+), 136 deletions(-) diff --git a/server/upload/internal/logic/uploadfilebaselogic.go b/server/upload/internal/logic/uploadfilebaselogic.go index 1383730a..0e079884 100644 --- a/server/upload/internal/logic/uploadfilebaselogic.go +++ b/server/upload/internal/logic/uploadfilebaselogic.go @@ -1,21 +1,16 @@ package logic import ( - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" "fusenapi/utils/file" "fusenapi/utils/hash" - "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" ) @@ -66,91 +61,35 @@ func (l *UploadFileBaseLogic) UploadFileBase(req *types.UploadFileBaseReq, useri } } - // 定义存储桶名称 - var bucketName *string - var apiType int64 = req.ApiType - - // 根据类别选择存储桶 - switch req.UploadBucket { - case 2: - bucketName = basic.TempfileBucketName - default: - bucketName = basic.StorageBucketName - } - - // 设置AWS会话的区域 - l.svcCtx.AwsSession.Config.Region = aws.String("us-west-1") - - // 创建新的S3服务实例 - svc := s3.New(l.svcCtx.AwsSession) - - // 定义S3请求和当前时间 - var s3req *request.Request - + // 根据hash 查询数据资源 var resourceId string = hash.JsonHashKey(req.FileKey) - var uploadUrl = UploadUrl{} - resourceModel := gmodel.NewFsResourceModel(l.svcCtx.MysqlConn) - resourceInfo, err := resourceModel.FindOneById(l.ctx, resourceId) - if err == nil && resourceInfo.ResourceId != "" { - uploadUrl.Status = 1 - uploadUrl.ResourceId = resourceId - uploadUrl.ResourceUrl = *resourceInfo.ResourceUrl - } else { - dist, contentType, err := file.FileBase64ToByte(req.FileData) + // 上传文件 + var upload = file.Upload{ + Ctx: l.ctx, + MysqlConn: l.svcCtx.MysqlConn, + AwsSession: l.svcCtx.AwsSession, + } + uploadRes, err := upload.UploadFileByBase64(&file.UploadBaseReq{ + FileHash: resourceId, + FileData: req.FileData, + UploadBucket: req.UploadBucket, + ApiType: req.ApiType, + UserId: userId, + GuestId: guestId, + }) - if err != nil { - logx.Error(err) - return resp.SetStatus(basic.CodeFileUploadErr, "file upload err,base64tobyte error") - } - - // 创建S3对象存储请求 - s3req, _ = svc.PutObjectRequest( - &s3.PutObjectInput{ - Bucket: bucketName, - Key: &resourceId, - }, - ) - - // 设置请求体为文件数据 - s3req.SetBufferBody(dist) - - // 发送请求 - err = s3req.Send() - - // 检查是否有错误 - if err != nil { - logx.Error(err) - uploadUrl.Status = 0 - } else { - 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: &req.Metadata, - ApiType: &apiType, - BucketName: bucketName, - }) - if err != nil { - logx.Error(err) - } - } + if err != nil { + logx.Error(err) + return resp.SetStatus(basic.CodeFileUploadErr, "upload file failed") } // 返回成功的响应和上传URL return resp.SetStatus(basic.CodeOK, map[string]interface{}{ - "upload_data": uploadUrl, + "upload_data": UploadUrl{ + Status: 1, + ResourceId: uploadRes.ResourceId, + ResourceUrl: uploadRes.ResourceUrl, + }, }) } diff --git a/utils/file/upload.go b/utils/file/upload.go index 38b0e826..2596b14e 100644 --- a/utils/file/upload.go +++ b/utils/file/upload.go @@ -65,63 +65,71 @@ func (upload *Upload) UploadFileByBase64(req *UploadBaseReq) (*UploadBaseRes, er var uploadBaseRes = UploadBaseRes{} resourceModel := gmodel.NewFsResourceModel(upload.MysqlConn) - resourceInfo, err := resourceModel.FindOneById(upload.Ctx, resourceId) - if err == nil && resourceInfo.ResourceId != "" { - uploadBaseRes.Status = 1 - uploadBaseRes.ResourceId = resourceId - uploadBaseRes.ResourceUrl = *resourceInfo.ResourceUrl - } else { - dist, contentType, err := FileBase64ToByte(req.FileData) - - if err != nil { - logx.Errorf("err:%+v,desc:%+v", err, "fail.upload.resourceInfoGet.mysql") - return nil, err - } - - // 创建S3对象存储请求 - s3req, _ = svc.PutObjectRequest( - &s3.PutObjectInput{ - Bucket: bucketName, - Key: &resourceId, - }, - ) - - // 设置请求体为文件数据 - s3req.SetBufferBody(dist) - - // 发送请求 - err = s3req.Send() - - // 检查是否有错误 - if err != nil { - logx.Errorf("err:%+v,desc:%+v", err, "fail.upload.s3req") - return nil, err - } else { - var url = s3req.HTTPRequest.URL.String() - // 打印请求URL - logx.Info(url) + 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 = url - var version string = "0.0.1" - var nowTime = time.Now() - _, err = resourceModel.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, - }) + uploadBaseRes.ResourceUrl = *resourceInfo.ResourceUrl + } else { + dist, contentType, err := FileBase64ToByte(req.FileData) + if err != nil { - logx.Errorf("err:%+v,desc:%+v", err, "fail.upload.resourceInfoAdd.mysql") - return nil, err + logx.Errorf("err:%+v,desc:%+v", err, "fail.upload.resourceInfoGet.mysql") + return err + } + + // 创建S3对象存储请求 + s3req, _ = svc.PutObjectRequest( + &s3.PutObjectInput{ + Bucket: bucketName, + Key: &resourceId, + }, + ) + + // 设置请求体为文件数据 + s3req.SetBufferBody(dist) + + // 发送请求 + 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 }