【菜鸟竟然是我自己🤡】不是官方库的问题,是我的问题

背景
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 只能读一次!

最后:查了大半天了,傻逼了 :rofl: 问为什么不去问问其他AI,我只能说豆包和通义千问,真不太行。。。。

5 个赞

哈哈,还得是gpt和deepseek,会给你一步步分析

2 个赞

这种功能类型的,你直接提需求给ai就行了,还省事

2 个赞

持续迭代的 这不是初版代码了 必须跟着线上的复杂情况持续迭代 ,Ai也只是返回相对简单的代码 除非加上很多条件,比如图片格式识别,可以是url提取,也可以是响应头部,但线上就会有url无后缀和响应头里没有格式信息返回

1 个赞

确实是这样的,之前初学go在公司做项目时也出过这种问题,后面加了个中间件,每次请求中间件会将参数存到上下文然后从中间件读

2 个赞

:tieba_087: 还得是其他ai

2 个赞

可以在一开始写的时候就让ai来,我的意思是,已有代码的话和项目耦合比较深的,那你就得提供更多的上下文了,不清楚上下文的情况下,ai确实是返回的比较简单,这种糟心的活,能给ai就给ai,自己把握流程就好了。

3 个赞

我感觉这个是经常会遇到的问题了,之前我面试就被问到过类似的:gin框架中连续两次ShouldBind()会出现什么问题

1 个赞

是的嘞,还是得好好学习 :laughing:下次就知道了

1 个赞

也踩过这个坑

2 个赞

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。