docs/upload_file.zh.md
Rama main · réplica de lectura del repositorio original.
# UPLOAD_FILE API 接口文档
## 🌐 语言切换
[中文版](./upload_file.zh.md) | [English](./upload_file.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/upload_file
Content-Type: multipart/form-data
```
## 功能描述
上传文件到对象存储(服务端中转)。客户端把文件字节提交到本服务,服务端转发上传到对象存储,
上传成功后按文件实际体积计费(0.005 元/MB),并返回带签名的下载 URL。
对象存储密钥全程留在服务端,不会下发给客户端。
## 请求参数
以 `multipart/form-data` 提交:文件放在 `file` 字段,密钥放在 `apiKey` 字段。
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/upload_file \
-F "file=@demo.mp4" \
-F "apiKey=123e8567-e89b-12d3-a856-826618178000"
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| file | file | ✅ | - | 待上传文件,单文件最大 500MB |
| apiKey | string | 按服务端配置 | - | 合法的 UUID;`ENABLE_APIKEY=true` 时必填,可登录 https://jcaigc.cn/user-info 获取 |
### 参数详解
#### file
- **类型**: 文件(multipart/form-data)
- **说明**: 支持常见音视频/图片格式:mp4、mov、m4v、avi、mkv、flv、webm、wmv、mp3、wav、m4a、aac、flac、ogg、jpg、jpeg、png、gif、webp、bmp
- **限制**: 单文件最大 500MB,空文件会被拒绝
#### apiKey
- **类型**: string
- **说明**: 必须是合法的 UUID 格式;服务端开启 apiKey 校验时必填,且充值余额需大于 0 才可上传
## 响应格式
### 成功响应 (200)
```json
{
"code": 0,
"message": "success",
"url": "https://bucket.oss-cn-hangzhou.aliyuncs.com/jianchuang/2026-10-06/8f3a1c2d5e6b7a90_demo.mp4?OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx",
"key": "jianchuang/2026-10-06/8f3a1c2d5e6b7a90_demo.mp4",
"size": 10485760,
"size_mb": 10.0,
"cost": 0.05,
"url_expire_days": 7
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| url | string | 对象存储带签名的临时下载地址,可直接传给 add_videos / add_images / add_audios 等接口 |
| key | string | 对象存储 object key |
| size | int | 文件实际字节数 |
| size_mb | float | 文件体积(MB,保留 3 位小数) |
| cost | float | 本次上传费用(元,最低 0.002);未启用计费时为 0 |
| url_expire_days | int | url 有效期(天),取 `VIDEO_GEN_RETENTION_DAYS`(默认 7 天) |
### 错误响应
```json
{
"code": 2050,
"message": "不支持的文件类型,请上传受支持格式的文件"
}
```
## 使用示例
### cURL 示例
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/upload_file \
-F "file=@demo.mp4" \
-F "apiKey=123e4567-e89b-12d3-a456-426614174000"
```
### Python 示例
```python
import requests
with open("demo.mp4", "rb") as f:
resp = requests.post(
"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/upload_file",
files={"file": ("demo.mp4", f, "video/mp4")},
data={"apiKey": "123e4567-e89b-12d3-a456-426614174000"},
timeout=600,
)
result = resp.json()
video_url = result["url"] # 可直接传给 add_videos / add_images / add_audios
print("体积:", result["size_mb"], "MB", "费用:", result["cost"], "元")
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 1001 | 参数校验失败 | 缺少 file 字段、apiKey 不是合法 UUID,或上传了空文件 | 检查请求参数 |
| 2004 | 文件大小超出限制 | 文件超过 500MB | 压缩或切分文件后重试 |
| 2035 | 充值余额不足 | 充值余额需大于 0,且需覆盖本次上传费用 | 前往 https://jcaigc.cn/recharge 充值后重试 |
| 2036 | 无效的 apiKey | `ENABLE_APIKEY=true` 且 apiKey 缺失或非法 | 登录 https://jcaigc.cn/user-info 获取 apiKey |
| 2049 | 无效的文件名 | 文件名为空或清洗后没有可用字符 | 提供合法的文件名 |
| 2050 | 不支持的文件类型 | 扩展名不在内置白名单内 | 改用受支持的格式 |
| 9998 | 系统内部错误 | 未配置任何对象存储或上传失败 | 检查服务端对象存储配置 |
## 注意事项
1. **服务端中转**:文件先上传到本服务,再由服务端上传到对象存储;对象存储密钥不会下发给客户端
2. **计费规则**:0.005 元/MB,按文件实际字节数计算(保留 6 位小数),单次最低扣费 0.002 元,仅在对象存储上传成功后才扣费;余额不足以覆盖本次费用时会在上传前直接拒绝
3. **大小限制**:单文件最大 500MB;若部署在 nginx 之后,需同时放开 `client_max_body_size`(默认 1MB 会直接返回 413)
4. **有效期**:返回的 `url` 为带签名的临时地址,有效期由 `VIDEO_GEN_RETENTION_DAYS` 控制(默认 7 天)
5. **上传完成即可用**:`url` 可直接传给 add_videos / add_images / add_audios 等接口使用
## 工作流程
1. 校验 apiKey(`ENABLE_APIKEY=true` 时)与充值余额(需大于 0)
2. 清洗文件名并校验扩展名白名单
3. 流式落盘并统计文件体积(超过 500MB 或为空则拒绝)
4. 上传文件到对象存储(COS / OSS / TOS)
5. 上传成功后按体积扣费
6. 返回带签名的下载 URL
## 相关接口
- [创建草稿](./create_draft.zh.md)
- [添加视频](./add_videos.zh.md)
---
<div align="right">
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
</div>