🐛 图片预览

This commit is contained in:
sugarBecomer
2026-03-12 08:07:33 +08:00
parent 60789ded9d
commit 658a9c2b3e
5 changed files with 54 additions and 1 deletions
+5
View File
@@ -13,3 +13,8 @@ type UploadImageReq struct {
CpUserId int64 `json:"cpUserId" v:"required#请指定今日校园用户"`
TaskType cptask.TaskType `json:"taskType" v:"required#请指定任务类型"`
}
type PreviewImageReq struct {
g.Meta `path:"/image/preview" method:"get" tags:"Image" summary:"预览图片"`
Key string `json:"key" v:"required#请指定图片key" in:"query"`
}
@@ -8,4 +8,5 @@ import (
type ICpImageCtrlV1 interface {
Upload(ctx context.Context, req *v1.UploadImageReq) (res *utils.Response[any], err error)
Preview(ctx context.Context, req *v1.PreviewImageReq) (res *utils.Response[any], err error)
}
@@ -15,6 +15,11 @@ func (c CpImageCtrlV1) Upload(ctx context.Context, req *v1.UploadImageReq) (res
return service.Global.CpImage.Upload(ctx, req), nil
}
func (c CpImageCtrlV1) Preview(ctx context.Context, req *v1.PreviewImageReq) (res *utils.Response[any], err error) {
defer utils.Pass(&err)
return service.Global.CpImage.Preview(ctx, req), nil
}
func NewCpImageCtrlV1() ICpImageCtrlV1 {
return &CpImageCtrlV1{}
}
+1 -1
View File
@@ -26,7 +26,7 @@ func ExceptionHandler(r *ghttp.Request) {
if err == nil && r.Response.BufferLength() > 0 {
return
}
if r.Response.Header().Get("Content-Type") == "image/png" {
if ct := r.Response.Header().Get("Content-Type"); ct != "" && len(ct) > 6 && ct[:6] == "image/" {
return
}
+42
View File
@@ -2,18 +2,23 @@ package cpdaily
import (
"context"
"io"
v1 "likedream-goframe/internal/api/v1"
"likedream-goframe/internal/application/cpdaily/imageuploader"
"likedream-goframe/internal/application/cpdaily/login"
"likedream-goframe/internal/application/cpdaily/school"
"likedream-goframe/internal/application/cpdaily/types"
"likedream-goframe/internal/application/filestorage"
"likedream-goframe/internal/common/db"
errors2 "likedream-goframe/internal/common/errors"
"likedream-goframe/internal/ent/cpimage"
"likedream-goframe/internal/ent/cptask"
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/sysuser"
"likedream-goframe/internal/utils"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/google/uuid"
"github.com/samber/oops"
)
@@ -50,6 +55,43 @@ func (v CpImageServiceV1) Upload(ctx context.Context, req *v1.UploadImageReq) *u
})
}
func (v CpImageServiceV1) Preview(ctx context.Context, req *v1.PreviewImageReq) *utils.Response[any] {
// 解析 key,可能是 UUID(旧数据)或直接的 S3 key
parsedUUID, uuidErr := uuid.Parse(req.Key)
var s3Key string
var contentType string
if uuidErr == nil {
// 是 UUID,从 cpimage 表查询对应的 S3 key
targetImage, e := db.Global.CpImage.Query().
Where(cpimage.ImageID(parsedUUID)).
Select(cpimage.FieldKey, cpimage.FieldContentType).
Only(ctx)
if e != nil {
return utils.Fail(404, "图片不存在")
}
s3Key = targetImage.Key
contentType = targetImage.ContentType
} else {
// 不是 UUID,直接当作 S3 key 使用
s3Key = req.Key
contentType = "image/jpeg"
}
// 从 S3 获取图片
file := filestorage.GlobalS3.GetFile(ctx, s3Key)
defer file.Close()
// 直接写入 HTTP 响应流
r := ghttp.RequestFromCtx(ctx)
r.Response.Header().Set("Content-Type", contentType)
r.Response.Header().Set("Cache-Control", "public, max-age=86400")
_, err := io.Copy(r.Response.Writer, file)
utils.OkOrPanic(err, oops.WithContext(ctx).Wrap)
return nil
}
// convertTaskType 将 ent 的 TaskType 转换为 cpdaily types.TaskType
func convertTaskType(ctx context.Context, tt cptask.TaskType) types.TaskType {
switch tt {