# 结果下载
> 无需鉴权读取签名下载地址,或带鉴权下载图片、视频二进制;均支持 Range。
Base URL:`https://platform.sgt.site`
| 方法 | 路径 |
| --- | --- |
| GET / HEAD | `/apimart/v1/tasks/{task_id}/artifacts/{index}?expires=…&sig=…` |
| GET | `/apimart/v1/tasks/{task_id}/content/{index}` |
任务查询返回的每个 url 都无需额外鉴权即可读取:要么是上游产物链接,要么是平台签名下载地址。直接使用查询返回的完整 URL 即可。鉴权下载地址 `/content/{index}` 保留给已有客户端和历史响应,index 来自所有已发现产物的顺序。
## 签名下载地址
```http
GET /apimart/v1/tasks/task_example/artifacts/0?expires=1790640030&sig=example HTTP/1.1
```
请求不附带 `Authorization`、Cookie 或任何密钥。URL 可直接放入 img/video 元素、交给只接收 URL 的下载器,或作为参考素材传给支持该格式的模型。不要自行拼装或修改这个 URL:签名覆盖任务、产物序号和 `expires`,改动任何一项都会返回 403。
- 成功时返回图片或视频二进制,按响应 `Content-Type` 保存。
- 可携带 `Range: bytes=0-1048575`,依据 200/206 和 Content-Range 处理。
- HEAD 只返回响应头,包括 `Content-Type` 和 `Content-Length`。
- 浏览器跨域读取时,响应带 `Access-Control-Allow-Origin: *`,并暴露 Content-Range、Accept-Ranges、Content-Length 和 Content-Type。
| HTTP | 典型含义 |
| --- | --- |
| 403 | 签名缺失、无效、被修改或已过期 |
| 404 | 任务或产物不存在,或任务已删除 |
| 409 | 任务尚未成功、已失败或已退款 |
| 410 | 上游产物已过期或不可读取 |
| 416 | 请求的字节范围不可用 |
| 429 | 下载过于频繁;按来源 IP 计数,默认每分钟 600 次 |
签名下载地址默认 24 小时有效。它属于限时读取授权:在有效期内,撤销虚拟密钥或模型权限不会使已发出的地址失效。不要把它当作永久链接分享或保存,过期后重新查询任务即可得到新地址。
## 鉴权下载(兼容)
```http
GET /apimart/v1/tasks/task_example/content/0 HTTP/1.1
Authorization: Bearer YOUR_VIRTUAL_KEY
```
成功返回图片或视频二进制,可携带 Range,语义同上。每次读取都会重新校验任务归属、企业和当前虚拟密钥的模型/渠道权限。浏览器直接把该地址填入 img/video 元素无法附带 Bearer 头,新客户端应直接使用查询返回的 url。不要把虚拟密钥拼到 URL 查询参数中。
只对与平台 Base URL 同源的鉴权下载地址附带 `Authorization`。上游产物链接位于其他域名,签名下载地址自带读取授权,两者都必须匿名读取。附带额外鉴权头可能导致上游拒绝签名链接。
| HTTP | 典型含义 |
| --- | --- |
| 401 | 密钥无效或未提供 |
| 403 | 当前模型或渠道权限不再允许读取 |
| 404 | 任务/索引不存在、无归属,或任务已删除 |
| 409 | 任务尚未成功或输出不可用 |
| 410 | 生成结果已过期或不可读取 |
| 416 | 请求的字节范围不可用 |
两种下载读取的都是同一份上游产物,不延长上游有效期,也不代表结果已永久保存;请在任务完成后尽快下载。