很多人接完生图 API就直接把返回的 URL 存进数据库、渲染到详情页。 过一阵子发现图全挂了——那些链接是有时效的。
这篇讲该服务出图之后, 图片该怎么托管才不会哪天集体失效。
一、第一条铁律:拿到就转存
生成接口返回的链接不要当作长期存储。正确做法是拿到后立刻下载、转存到自己的对象存储:
async function persist(url, key) { const r = await fetch(url, { signal: AbortSignal.timeout(60_000) }); if (!r.ok) throw new Error('下载失败 HTTP ' + r.status); const buf = Buffer.from(await r.arrayBuffer()); await oss.put(key, buf); // 你的 OSS / S3 / COS return oss.publicUrl(key); } // 出图 → 立刻转存 → 库里只存自己的地址 const data = await callTtq('nano-banana-pro', prompt); const finalUrl = await persist(pickUrl(data), `sku/${skuId}/main.png`); await db.images.insert({ skuId, url: finalUrl }); // 存自己的,不存原始链接转存失败要当成整个任务失败,别只记原始链接就算完事——那等于埋了个定时炸弹。
二、命名要能反查
图片 key 别用随机数或时间戳,用能反推来源的结构:
sku/{skuId}/{用途}-{模型}-{短哈希}.png 例:sku/10086/main-nano-banana-pro-a3f9c1.png sku/10086/scene-gpt-image-2-7b2e04.png好处是出问题时能直接从文件名看出:哪个商品、什么用途、哪个模型出的。 后面想统计"哪个模型出的图被采用得多",扫一遍 key 就够了。
三、CDN 前面加一层,别让 OSS 直出
电商详情页图片访问量大,直连 OSS 有两个问题:贵(流量费)和慢(没有边缘节点)。
前面挂 CDN 之后还要注意:
- 缓存时间设长。图片一旦生成基本不会改,
Cache-Control: max-age=31536000 - 要改图就换 key,别原地覆盖。覆盖了 CDN 还在返回旧的,刷缓存又慢又麻烦
- 开 WebP 自动转换(如果 CDN 支持),体积能再降三四成
四、别把原图直接挂详情页
生图接口出的往往是 2K/4K PNG,单张两三 MB。直接挂上去详情页能卡到用户流失。
转存时同时生成几个尺寸:
const sharp = require('sharp'); async function persistVariants(buf, base) { await Promise.all([ oss.put(`${base}-orig.png`, buf), // 原图留档 oss.put(`${base}-1200.jpg`, await sharp(buf).resize(1200, 1200, { fit: 'contain', background: '#fff' }).jpeg({ quality: 82, mozjpeg: true }).toBuffer()), oss.put(`${base}-400.jpg`, await sharp(buf).resize(400, 400, { fit: 'contain', background: '#fff' }).jpeg({ quality: 80, mozjpeg: true }).toBuffer()), ]); }原图一定要留档。以后要重新裁、要换尺寸、要做别的用途,有原图就不用重新花积分出图。
五、成本上的取舍
| 存什么 | 要不要留 | 理由 |
|---|---|---|
| 原图(2K/4K PNG) | 留 | 重出一张要花积分,存储比重出便宜得多 |
| 各尺寸压缩版 | 留 | 直接给前端用 |
| 明确废弃的废图 | 定期清 | 质检没过的没必要长期占空间 |
| 提示词 + 模型名 | 必须留 | 想复现或微调时的唯一依据 |
最后一条最容易漏。图存了但提示词没存,将来想出一张风格一致的, 只能凭记忆重新试——这才是真正的浪费。
六、模型与消耗
| 模型代码 | 定位 | 消耗 |
|---|---|---|
nano-banana2 | 跑量草稿 | 8 积分/次 |
nano-banana-pro | 终稿,支持 1K/2K/4K | 10 积分/次 |
gpt-image-2 | 细节质感 | 按次计费 |
Veo 3.1 视频生成/Sora 2 | 生视频 | 120 / 130 积分/次 |
七、小结
托管四条:返回链接拿到就转存别直接用、key 命名要能反查来源、CDN 缓存设长且改图换 key、原图和提示词都要留档。
该服务出图快、并发高,转存这一步才不会成为瓶颈;模型全(nano banana pro、gpt-image-2、Veo 3.1、Sora 2)、价格便宜、稳定。
接口服务:甜甜圈API(dashengfenshen.cn)