OpenAI Images API 生成结果 URL 和 Base64 怎么保存
准备
先确定图片最终放在哪里,例如应用服务器的受管目录、对象存储或团队素材库。为每次生成预留一条任务记录,至少包含任务编号、请求时间、模型、提示词、输出格式、原始返回类型和最终文件地址。
Images API 的图片返回可能是 url 或 b64_json。资料显示,使用 dall-e-2 或 dall-e-3 时可选择这两种返回格式;返回的 URL 仅在图片生成后 60 分钟内有效。GPT Image 模型则返回 Base64 编码图片,因此归档流程应以“收到结果即落盘”为原则。
先判断该保存 URL 还是 Base64
- 响应中有
url:立刻由服务端下载图片二进制,再上传到自己的存储;数据库保存自己的文件地址,不把临时 URL 作为长期展示地址。 - 响应中有
b64_json:把 Base64 字符串解码为二进制文件,再上传或写入受管目录;不要把整段字符串直接用于长期页面展示。 - 同一任务返回多张图:逐张生成独立文件名和素材记录,避免用同一文件名覆盖前一张。
分步操作
- 创建生成任务时,先决定本次要使用 URL 返回还是 Base64 返回。仅对支持该参数的模型传入
response_format;不要假设所有模型都接受该设置。 - 收到响应后遍历
data中的每一项。优先检查是否存在b64_json,否则检查是否存在url;字段缺失时记录完整任务错误并停止入库。 - 若拿到 URL,在有效期内由后端发起下载请求,读取响应二进制内容。下载成功后上传到你的存储,并记录存储返回的文件地址。
- 若拿到
b64_json,先执行 Base64 解码,得到字节内容;按本次输出格式写为对应图片文件,再上传或入库。 - 为最终文件生成不含空格的唯一文件名,例如
img_任务号_序号.png。扩展名应与实际输出格式一致,不要仅凭默认名称猜测。 - 写入素材记录:任务编号、图片序号、最终文件地址、文件格式、生成参数和保存状态。提示词追溯可沿用记录改写后提示词的方法,把原始请求和实际结果放在同一条记录中。
- 读取刚保存的文件做一次校验:确认文件存在、大小大于零,且业务侧能正常打开或读取。通过后再把任务标为完成。
可复制模板或示例
下面是 Python 侧的通用处理示例。示例只演示结果落盘逻辑,response 为已获得的 Images API 响应对象;实际项目中请将本地保存替换为你的对象存储上传步骤。
import base64
from pathlib import Path
from urllib.request import urlopen
output_dir = Path("generated_images")
output_dir.mkdir(exist_ok=True)
for index, item in enumerate(response.data, start=1):
file_path = output_dir / f"img_job_123_{index}.png"
if getattr(item, "b64_json", None):
image_bytes = base64.b64decode(item.b64_json)
elif getattr(item, "url", None):
with urlopen(item.url) as remote_file:
image_bytes = remote_file.read()
else:
raise ValueError("图片响应中没有 url 或 b64_json")
file_path.write_bytes(image_bytes)
if not file_path.exists() or file_path.stat().st_size == 0:
raise ValueError("图片文件保存失败")
print({"index": index, "path": str(file_path)})
可复制的素材记录字段模板:
{
"job_id": "img_job_123",
"image_index": 1,
"result_type": "b64_json",
"storage_path": "generated_images/img_job_123_1.png",
"output_format": "png",
"save_status": "verified"
}
翻车怎么改
常见故障:页面过一段时间后图片无法显示。原因:应用长期使用了接口返回的 URL,而该 URL 只有有限有效期。修正动作:把 URL 当作一次性下载入口,在响应到达后立即下载到自己的存储;页面和素材库只引用自己的文件地址。
常见故障:Base64 解码后文件打不开。原因:把整个响应对象或带有其他前缀的字符串传给了解码器,或写入过程中使用了文本模式。修正动作:只取 b64_json 字段进行 Base64 解码,并以二进制方式写入;保存后立即检查文件大小和可读性。
常见故障:批量生成后素材互相覆盖,无法追溯来源。原因:文件名固定,或只保存图片没有保存任务信息。修正动作:文件名加入任务编号和图片序号,并为每张图单独记录参数、返回类型、最终存储地址与状态。
完成前检查
- 发布前验收项:随机打开已归档的图片,确认页面引用的是自己的存储地址,而不是接口临时 URL。
- 每张结果均有唯一文件名,文件存在且大小大于零。
- 每条素材记录都能对应到任务编号、图片序号和最终文件地址。
- Base64 结果已完成解码并保存为二进制图片文件,没有把长字符串直接当作素材文件。
- 需要透明背景或指定格式时,已按实际输出格式检查文件扩展名与素材可用性。
下一步
把这篇的方法练一遍
提示词和步骤可以带到创作里直接试做一版。