现场是这样的。用 Python 读图片后直接拼进 data URL,base64 字符串每 76 个字符带一个换行,接口回 400,原文是 Invalid image: invalid base64 data,本地解码却正常。

中间走过弯路,把「用了 urlsafe 变体 含短横线和下划线」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。标准 base64 编码带换行 接口不接受;data URL 前缀拼错 多了空格;图片本身损坏 解码后不是有效格式。

动手时先检查字符串里有没有换行

python -c "s=open('b64.txt').read();print(s.count(chr(10)))"

然后用不带换行的编码重新生成

python -c "import base64;print(len(base64.b64encode(open('a.png','rb').read()).decode()))"

校验前缀与 MIME 类型

python -c "print('data:image/png;base64,')"

发一次最小图片请求

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d @img_req.json

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

别只看报错消失,验证要多做一步。请求返回 200,模型能描述图片内容,日志里不再出现 invalid base64。

容易忽略的是,不同语言的编码器是否插入换行不一样,Python 默认不换行,Java 的 MIME 编码器会换行,跨语言时要显式指定。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189