# 获取预签名上传地址

- API 版本：1.10.0
- 最后更新：2026-09-29
- 服务地址：`https://api.ailingtu.com`
- 网页文档：[获取预签名上传地址](/openapi/presign)
- 完整接口约束：[JSON Schema](/openapi/operations/createFileUpload.json)
- 接口发现：[接口索引](/openapi/operations/index.json)

## POST /v1/file/presign

接口标识：`createFileUpload`

提交文件信息和兼容 Hash，获取 fileId 与对象存储上传地址。isNew=false 表示文件已存在，可跳过上传和确认。

鉴权：请求头 `x-api-key: <YOUR_API_KEY>`；密钥仅保存在服务端。

成功判断：HTTP 2xx 且响应 code=0；异步任务还需查询最终状态。

### 请求参数

| 字段 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| `fileName` | body | string | 是 | 包含扩展名的文件名 |
| `contentType` | body | string | 是 | 文件 MIME 类型 |
| `size` | body | integer | 是 | 文件字节数 |
| `hash` | body | string | 是 | 文件字节转小写 hex 后，再计算 SHA-256 |

请求格式：`application/json`

### 请求示例

```json
{
  "fileName": "video.mp4",
  "contentType": "video/mp4",
  "size": 12345678,
  "hash": "3786a02b..."
}
```

### 成功响应

```json
{
  "code": 0,
  "data": {
    "fileId": 591,
    "uploadUrl": "https://object-storage.example.com/presigned-url",
    "url": "https://cdn.ailingtu.com/media/video.mp4",
    "isNew": true,
    "expiresAt": "2026-07-29T12:00:00Z"
  },
  "message": "success"
}
```

### 响应字段

以下列出主要层级；完整结构、联合类型及校验规则以接口 JSON Schema 为准。必填指字段所在对象中的约束。

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `code` | integer | 是 | 固定值：0 |
| `message` | string | 否 | — |
| `data` | object | 是 | — |
| `data.fileId` | union | 是 | — |
| `data.uploadUrl` | string \| null | 否 | — |
| `data.url` | string | 是 | — |
| `data.isNew` | boolean | 是 | — |
| `data.expiresAt` | string \| null | 否 | — |

### 接入说明与限制

- isNew=true 时，使用相同 Content-Type 将原始文件 PUT 到 uploadUrl，成功后再调用 confirm。
- 对象存储 PUT 请求不要携带 x-api-key。

### 错误处理

| HTTP | 说明 |
|---|---|
| 400 | 请求参数或请求体无效，请修正后重试。 |
| 401 | API 密钥缺失或无效，请检查 x-api-key。 |
| 403 | API 密钥没有此接口的调用权限。 |
| 429 | 请求过于频繁，请采用指数退避重试。 |
| 500 | 服务端发生错误；对于暂时性故障采用指数退避重试。 |

业务 code 非零时也应按失败处理。不要对参数、权限或授权错误盲目重试。创建发布或生成任务超时后先查询原任务，避免重复创建。
