fix: 回退存储路径也解码重编码,彻底剥离 EXIF/元数据
- fallback 路径不再直接写原始上传字节,而是解码后重编码 - JPEG: decode → jpeg.Encode(quality 92),剥离 EXIF/GPS/注释 - PNG: decode → png.Encode,剥离元数据块 - WebP: decode → webp.Encode(quality 80),剥离元数据 - GIF 例外:重编码会丢失动画帧,仅解码验证后原样存储 - 导入 jpeg/png 从空白导入改为命名导入,以使用 Encode 函数
This commit is contained in:
@ -5,9 +5,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
_ "image/gif"
|
"image/jpeg"
|
||||||
_ "image/jpeg"
|
"image/png"
|
||||||
_ "image/png"
|
_ "image/gif" // 仅注册 GIF 解码器,不重编码(会丢失动画)
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@ -449,11 +449,38 @@ func (ctrl *PostController) UploadImage(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 原格式存储(GIF / 已有 WebP / 二分压缩仍超原文件大小)
|
// 回退存储:重新编码以剥离 EXIF/元数据(GIF 例外:重编码会丢失动画)
|
||||||
if savePath == "" {
|
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)
|
filename := fmt.Sprintf("%d_%d%s", uid, ts, ext)
|
||||||
savePath = filepath.Join(storageDir, filename)
|
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, "保存图片失败")
|
common.Error(c, http.StatusInternalServerError, "保存图片失败")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user