🐛 图片预览
This commit is contained in:
@@ -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{}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user