From 48186085d88754d4cbd122e3a8edd6f33cb62530 Mon Sep 17 00:00:00 2001 From: Victor_Jay Date: Sun, 31 May 2026 03:12:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9B=9E=E9=80=80=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=B9=9F=E8=A7=A3=E7=A0=81=E9=87=8D=E7=BC=96?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E5=BD=BB=E5=BA=95=E5=89=A5=E7=A6=BB=20EXIF/?= =?UTF-8?q?=E5=85=83=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fallback 路径不再直接写原始上传字节,而是解码后重编码 - JPEG: decode → jpeg.Encode(quality 92),剥离 EXIF/GPS/注释 - PNG: decode → png.Encode,剥离元数据块 - WebP: decode → webp.Encode(quality 80),剥离元数据 - GIF 例外:重编码会丢失动画帧,仅解码验证后原样存储 - 导入 jpeg/png 从空白导入改为命名导入,以使用 Encode 函数 --- internal/controller/post_controller.go | 37 ++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/internal/controller/post_controller.go b/internal/controller/post_controller.go index 8a8eb68..49c39e8 100644 --- a/internal/controller/post_controller.go +++ b/internal/controller/post_controller.go @@ -5,9 +5,9 @@ import ( "errors" "fmt" "image" - _ "image/gif" - _ "image/jpeg" - _ "image/png" + "image/jpeg" + "image/png" + _ "image/gif" // 仅注册 GIF 解码器,不重编码(会丢失动画) "io" "net/http" "os" @@ -449,11 +449,38 @@ func (ctrl *PostController) UploadImage(c *gin.Context) { } } - // 原格式存储(GIF / 已有 WebP / 二分压缩仍超原文件大小) + // 回退存储:重新编码以剥离 EXIF/元数据(GIF 例外:重编码会丢失动画) if savePath == "" { + dataOut := data + + if isJPEGPNG || isWebP { + var decImg image.Image + var decErr error + if isWebP { + decImg, decErr = webp.Decode(bytes.NewReader(data)) + } else { + decImg, _, decErr = image.Decode(bytes.NewReader(data)) + } + if decErr == nil { + var buf bytes.Buffer + var encErr error + switch { + case isWebP: + encErr = webp.Encode(&buf, decImg, &webp.Options{Quality: 80}) + case ext == ".png": + encErr = png.Encode(&buf, decImg) + default: + encErr = jpeg.Encode(&buf, decImg, &jpeg.Options{Quality: 92}) + } + if encErr == nil && buf.Len() > 0 { + dataOut = buf.Bytes() + } + } + } + filename := fmt.Sprintf("%d_%d%s", uid, ts, ext) savePath = filepath.Join(storageDir, filename) - if err := os.WriteFile(savePath, data, 0644); err != nil { + if err := os.WriteFile(savePath, dataOut, 0644); err != nil { common.Error(c, http.StatusInternalServerError, "保存图片失败") return }