背景:
golang开发、给一个url从网络下载,并且获取该图片的尺寸
已知:
存在url的无后缀或后缀和实际图片格式不符合、webp和(jpg、png、gif)的做图片尺寸解析的库是不一样的
需要实现的步骤:
1、下载图片
2、图片类型识别 - 根据下载的图片前几位字节码识别
3、丢到第三方库直接解析获取尺寸
报错信息:
1、riff: missing RIFF chunk header
2、webp: invalid format
3、image: unknown format
相关大体代码:
resp, err := http.Get(imageURL)
if err != nil {
return 0, 0, err
}
defer resp.Body.Close()
imageFormat, err := GetImageFormatByResp(resp)
if err != nil {
return 0, 0, err
}
var imgConfig image.Config
if imageFormat == constant.FormatWebP {
imgConfig, err = webp.DecodeConfig(resp.Body)
} else if util.Contains([]string{constant.FormatJPEG, constant.FormatPNG, constant.FormatGIF}, imageFormat) {
imgConfig, _, err = image.DecodeConfig(resp.Body)
} else {
err = errors.New("unknown image format")
}
if err != nil {
return 0, 0, err
}
width := imgConfig.Width
height := imgConfig.Height
return width, height, nil
排查思路:
1、确认url是否是个图片
2、确认图片是否支持的类型
3、尝试浏览器下载图片到本地进行解析
4、如1&2正常,3不行更换第三方库
5、1&2&3&4都正常、尝试代码下载图片到本地解析
相关伪代码:
resp, err := http.Get(imageURL)
if err != nil {
return 0, 0, err
}
defer resp.Body.Close()
imageFormat, err := GetImageFormatByResp(resp)
if err != nil {
return 0, 0, err
}
filePath := "tmp."+imageFormat
// 省略代码
保存图片到本地
var imgConfig image.Config
if imageFormat == constant.FormatWebP {
imgConfig, err = webp.DecodeConfig(resp.Body)
} else if util.Contains([]string{constant.FormatJPEG, constant.FormatPNG, constant.FormatGIF}, imageFormat) {
imgConfig, _, err = image.DecodeConfig(resp.Body)
} else {
err = errors.New("unknown image format")
}
if err != nil {
return 0, 0, err
}
width := imgConfig.Width
height := imgConfig.Height
return width, height, nil
6、找DeepSeek 问问
排查现象:
1&2&3都能正常,在验证第4点的时候,发现文件破损!!!!!
挖槽?你敢信?你第一反应是什么?脑袋炸开,官方库有问题?????
deepseek:你个呆瓜!resp.Body 只能读一次!
最后:查了大半天了,傻逼了
问为什么不去问问其他AI,我只能说豆包和通义千问,真不太行。。。。
