From bde4e36e4755aac377a3691cb33630de91d1013f Mon Sep 17 00:00:00 2001 From: keven1024 Date: Fri, 27 Feb 2026 14:32:42 +0800 Subject: [PATCH] feat(worker): add image conversion functionality and support for WEBP format in image compression --- worker/internal/services/image.go | 3 +- worker/internal/tasks/image.go | 48 ++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/worker/internal/services/image.go b/worker/internal/services/image.go index 48e3d95..5132fb8 100644 --- a/worker/internal/services/image.go +++ b/worker/internal/services/image.go @@ -2,6 +2,7 @@ package services import ( "errors" + u "pkg/utils" "worker/internal/utils" "github.com/samber/lo" @@ -26,7 +27,7 @@ func CompressImage(filePath string, mimeType string) (string, error) { return "", err } case "image/jpeg": - err := utils.CopyFile(filePath, compressedPath) + err := u.CopyFile(filePath, compressedPath) if err != nil { return "", err } diff --git a/worker/internal/tasks/image.go b/worker/internal/tasks/image.go index 0571ad6..25fef08 100644 --- a/worker/internal/tasks/image.go +++ b/worker/internal/tasks/image.go @@ -7,8 +7,8 @@ import ( "mime" "path/filepath" "pkg/models" + "pkg/utils" "worker/internal/services" - "worker/internal/utils" "github.com/hibiken/asynq" ) @@ -55,6 +55,52 @@ func CompressImage(ctx context.Context, task *asynq.Task) error { return nil } +func ConvertImage(ctx context.Context, task *asynq.Task) error { + var payload ConvertImageTaskPayload + if err := json.Unmarshal(task.Payload(), &payload); err != nil { + return err + } + originalFileInfo, _ := models.GetRedisFileInfo(payload.FileId) + if originalFileInfo == nil || originalFileInfo.FileType != models.FileTypeUpload { + return errors.New("文件不存在") + } + uploadPath, err := utils.GetUploadDirPath() + if err != nil { + return err + } + originalPath := filepath.Join(uploadPath, payload.FileId) + convertedPath, err := services.ConvertImageWithMagick(originalPath, originalFileInfo.MimeType, payload.TargetExt) + if err != nil { + return err + } + mimeType := mime.TypeByExtension(payload.TargetExt) + if mimeType == "" { + return ErrUnknown + } + convertedFileInfo, err := services.GenStandardFile(convertedPath, mimeType) + if err != nil { + return err + } + + models.SetRedisTaskInfo(task.ResultWriter().TaskID(), map[string]any{ + "status": "success", + "result": []any{ + map[string]any{ + "old_file": map[string]any{ + "id": payload.FileId, + "size": originalFileInfo.FileSize, + }, + "new_file": map[string]any{ + "id": convertedFileInfo.FileId, + "size": convertedFileInfo.FileSize, + }, + }, + }, + }) + + return nil +} + func UpscaleImage(ctx context.Context, task *asynq.Task) error { return nil }