package logic import ( "context" "database/sql" "godemo/category/category" "godemo/file/file" "godemo/gallery/gallery" "godemo/gallery/internal/model" "godemo/gallery/internal/svc" "github.com/google/uuid" "github.com/zeromicro/go-zero/core/logc" "github.com/zeromicro/go-zero/core/logx" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) type UploadImageLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewUploadImageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UploadImageLogic { return &UploadImageLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // 图片上传 func (l *UploadImageLogic) UploadImage(in *gallery.UploadImageRequest) (*gallery.UploadImageResponse, error) { // 1. 根据 in.CategoryId 查询分类信息,获取分类名称 getFullCategoryRpcResp, getFullCategoryRpcErr := l.svcCtx.CategoryRpc.GetFullCategories(l.ctx, &category.GetCategoryRequest{ Id: *in.CategoryId, }) if getFullCategoryRpcErr != nil { return nil, status.Error(codes.Internal, getFullCategoryRpcErr.Error()) } // 2. 调用 file rpc Upload 接口,上传文件到MinIO fileUploadRpcResp, fileUploadRpcErr := l.svcCtx.FileRpc.Upload(l.ctx, &file.UploadRequest{ Filename: in.FileName, Content: in.FileContent, Folder: getFullCategoryRpcResp.FullCategoryName, Bucket: l.svcCtx.Config.BucketName, }) if fileUploadRpcErr != nil { return nil, status.Error(codes.Internal, fileUploadRpcErr.Error()) } // 3. 图片信息存入数据库 storageKey := l.svcCtx.Config.BucketName + "/" + fileUploadRpcResp.FileId insertResult, insertErr := l.svcCtx.ImagesModel.Insert(l.ctx, &model.Images{ ImageId: uuid.New().String(), StorageKey: storageKey, FileName: *in.Title, MimeType: "image/jpeg", FileSize: 10, CategoryId: sql.NullString{String: *in.CategoryId, Valid: true}, }) if insertErr != nil { return nil, status.Error(codes.Internal, insertErr.Error()) } logc.Infof(l.ctx, "insertResult: %v", insertResult) // 4. 调用 file rpc GenerateImageVersions 接口,生成缩略图和预览图 (异步) _, generateImageVersionsRpcErr := l.svcCtx.FileRpc.GenerateImageVersions(l.ctx, &file.GenerateImageVersionsRequest{ FileId: storageKey, Versions: []file.ImageVersion{file.ImageVersion_thumbnail, file.ImageVersion_preview}, }) if generateImageVersionsRpcErr != nil { return nil, status.Error(codes.Internal, generateImageVersionsRpcErr.Error()) } // 5. 返回接口执行结果 return &gallery.UploadImageResponse{}, nil }