预签名上传接口把原图送上去的两步操作
为什么不是「直接传文件」
官方接口的第一段是 POST /api/img_upload——注意它不收图片本体。它返回的是一个临时上传地址(官方文档描述为预签名上传 URL,底层是对象存储的临时直传通道),然后由你用 HTTP PUT 把文件推到这个地址。
这个设计的好处:文件数据不流经接口服务器,直进对象存储,大文件更稳、服务器压力更小。
两步的代码骨架
第一步:申请上传地址
curl -X POST <接口地址>/api/img_upload \
-H 'X-API-KEY: 你的密钥'
返回内容里带着上传地址字段(官方 Python 示例读取的是返回 JSON 的 fileurl 字段,上传地址字段见你实际拿到的返回体)。
第二步:把文件 PUT 上去
curl -X PUT '<上一步拿到的上传地址>' \
--data-binary @你的图片.jpg \
-H 'Content-Type: image/jpeg'
官方文档强调:使用与申请时相同的 Content-Type 上传。Content-Type 不一致是这段最常见的坑。
第三步不是接口,是记账
PUT 成功后,这个文件的可访问地址就是下一段创建任务时要传的 input 参数。把地址接住传下去即可,见创建任务的参数说明。
骨架的 Python 版
import requests
API_KEY = "你的密钥"
headers = {"X-API-KEY": API_KEY}
# 第一步:申请临时上传地址
r = requests.post(f"{root}/api/img_upload", headers=headers)
upload = r.json()
# 第二步:原样 PUT 文件(Content-Type 与返回要求一致)
with open("your_image.jpg", "rb") as f:
requests.put(upload["fileurl"], data=f,
headers={"Content-Type": "image/jpeg"})
(root 为接口根地址,从用户中心 API 页复制,此处省略;完整可运行版见 Python 全流程示例。)
上传环节的三个提醒
- 临时地址有时效——拿到地址尽快传,别囤;
- 文件超限在上传后才会暴露——体积与像素限制和网页端一致,见尺寸上限;
- input 也可以不传自己的——创建任务接口的 input 收的是图片 URL,理论上任何公网可访问的图片地址都能用,不一定走这段上传。