文件上传 API
上传图片、文档、沙箱产物并解析文件
Clouisle 提供知识库文档、聊天附件、沙箱产物和文件解析接口。上传与解析请求使用 multipart/form-data,读取文件返回二进制内容;除读取文件外,响应遵循统一的 code、data、msg 结构。
端点总览
| 方法 | 路径 | 用途 |
|---|---|---|
| POST | /api/v1/knowledge-bases/{kb_id}/documents/upload | 上传知识库文档并创建待处理文档 |
| POST | /api/v1/knowledge-bases/{kb_id}/documents/url | 从 URL 创建知识库文档 |
| POST | /api/v1/upload/image | 上传图片 |
| POST | /api/v1/upload/file | 上传通用图片或文档 |
| POST | /api/v1/upload/sandbox-artifact | 上传沙箱生成的产物 |
| POST | /api/v1/upload/parse | 解析单个文件文本 |
| POST | /api/v1/upload/parse/batch | 批量解析最多 5 个文件 |
| GET | /api/v1/upload/files/{category}/{year}/{month}/{filename} | 读取上传文件(受保护分类需认证授权) |
| DELETE | /api/v1/upload/files/{category}/{year}/{month}/{filename} | 删除存储文件(仅超级管理员) |
支持的格式与大小
知识库文档上传支持 PDF、DOC/DOCX、TXT/Markdown、HTML、CSV、XLS/XLSX、JSON 和 PPTX。图片、压缩包和视频不属于知识库文档类型。
通用图片上传支持 JPEG、PNG、GIF、WebP、SVG 和 ICO;通用文件上传还支持 PDF、TXT、Markdown、HTML、CSV、JSON、DOC/DOCX、XLSX 和 PPTX。
| 端点 | 大小限制 |
|---|---|
/api/v1/upload/image | 每个文件 10 MB |
/api/v1/upload/file | 每个文件 10 MB |
/api/v1/upload/parse | 每个文件 10 MB |
/api/v1/upload/parse/batch | 每个文件 10 MB,最多 5 个 |
| 知识库文档上传 | 默认 50 MB;由 kb_document_max_upload_size_mb 配置,范围 1–1024 MB |
聊天通用上传没有按格式拆分的大小上限;服务端统一执行每文件 10 MB 限制。
上传图片或通用文件
curl -X POST "$API_BASE_URL/api/v1/upload/file" \
-H "Authorization: Bearer $CLOUISLE_TOKEN" \
-F "file=@/path/to/report.pdf"/upload/image 与 /upload/file 都接受 category 查询参数,默认 general,常用值还有 avatar、icon;它决定存储目录并出现在返回的 url 中:
curl -X POST "$API_BASE_URL/api/v1/upload/image?category=avatar" \
-H "Authorization: Bearer $CLOUISLE_TOKEN" \
-F "file=@/path/to/avatar.png"响应中的文件名是生成的存储名。提交聊天附件时,使用响应返回的 url、filename、size 和 mime_type,不要根据 asset_id 自行拼接 /upload/files/{asset_id}。
{
"code": 0,
"data": {
"asset_id": "550e8400-e29b-41d4-a716-446655440000",
"url": "/api/v1/upload/files/general/2026/09/7f3a1c9d2b10_a1b2c3d4.pdf",
"filename": "7f3a1c9d2b10_a1b2c3d4.pdf",
"original_name": "report.pdf",
"size": 1048576,
"content_type": "application/pdf"
},
"msg": "success"
}将元数据放入 Agent 聊天请求的 file_urls 数组;已解析文件的旧 files 字段已弃用。详见 Agent 聊天 API。
解析文件
curl -X POST "$API_BASE_URL/api/v1/upload/parse?max_content_length=100000&truncate_strategy=end" \
-H "Authorization: Bearer $CLOUISLE_TOKEN" \
-F "file=@/path/to/document.pdf"max_content_length 默认 100000,允许 1000–500000;truncate_strategy 支持 end、start 和 middle。批量解析使用字段名 files,每次最多 5 个文件;单个文件失败会记录在对应错误结果中。
知识库文档与沙箱产物
知识库文档上传成功后状态为 pending。配置分块参数后,调用知识库处理端点开始嵌入和索引。
沙箱产物端点可以使用 JWT 或 clou_ API Key;内部沙箱请求也可以改用签名:请求头 X-Sandbox-Artifact-Timestamp(Unix 秒)与 X-Sandbox-Artifact-Signature,时间戳与当前时间相差超过 300 秒即被拒绝。大小限制由站点设置 SANDBOX_ARTIFACT_MAX_FILE_SIZE_MB 控制。
读取与删除文件
GET /api/v1/upload/files/{category}/{year}/{month}/{filename}返回存储文件的二进制内容。上传响应里的 url 已经是这个路径,直接使用即可;category、year、month、filename 会做路径段校验,不能包含 .. 或分隔符。
- 普通分类(如
general、avatar、icon)可直接读取,不需要认证头。 - 受保护分类(
agent-attachments、sandbox-artifacts、generated-images、generated-videos)以及任何挂着作用域引用的资产,必须带当前 JWT 或clou_API Key;缺失返回401,无权访问返回403,资产不存在或已不可用返回404。
curl -H "Authorization: Bearer $CLOUISLE_TOKEN" \
"$API_BASE_URL/api/v1/upload/files/generated-images/2026/09/9a8b7c6d5e4f_55667788.png" \
--output image.pngDELETE /api/v1/upload/files/{category}/{year}/{month}/{filename}删除存储文件,仅超级管理员可用;成功后 data 为 null。
访问控制与预览状态
受保护资产包括聊天附件(agent-attachments)、沙箱产物(sandbox-artifacts)、生成图片(generated-images)与生成视频(generated-videos)。读取或下载它们时,服务端按资产所属的执行作用域授权,作用域只有两种:
conversation:校验调用者能否访问该会话;API Key 还必须对会话所属 Agent 有权限。workflow_run:校验调用者能否访问该工作流运行(触发者、工作流可见性);API Key 还必须对工作流有权限。
资产没有任何作用域引用时,只有创建者本人或超级管理员可读。授权在读取字节之前完成,不会先落盘再判权。
聊天中生成的图片与视频在生成后注册为 Asset 并挂到对应消息的资产列表(会话作用域),因此刷新页面或重开历史仍能取回;沙箱产物同样以资产形式登记并跟随工作流运行作用域。
- 受保护媒体 URL 必须携带当前 JWT 或 API Key。客户端应展示未认证、无权限、不可用和预览过大状态,不得回退到未认证原始 URL。
asset_ref仅在对应会话或工作流运行范围内有效,不要猜测或跨范围复用;换作用域后同一asset_ref不再解析。
预览与展示应显式区分以下状态,而不是统一显示「加载失败」:
| 状态 | 触发条件 | 建议呈现 |
|---|---|---|
too-large | 文件超过预览上限 | 显示大小与限制,提供下载入口 |
unauthorized | 缺少凭证或凭证过期(401) | 提示登录或刷新凭证后重试 |
permission-denied | 有身份但不属于该会话/运行(403) | 说明无访问权限,不提供重试 |
unsupported | 类型不支持内联预览 | 仅提供下载 |
parse-failure | 解析或转换失败 | 说明失败原因,保留原始下载 |
错误
| 错误 | 代码 | 说明 |
|---|---|---|
| 文件过大 | 1001 | 超过端点限制;data.max_size 提供限制 |
| 类型不支持 | 1001 / 6003 | MIME 类型或扩展名不在允许列表中 |
| 批量文件过多 | 1001 | parse/batch 超过 5 个文件 |
| 未认证 | 2000 | 受保护文件缺少 JWT 或 API Key(HTTP 401) |
| 无权限 | 3000 | 有身份但不属于该会话/工作流运行(HTTP 403) |
| 文件不存在 | 4000 | 存储文件已不存在或资产已不可用(HTTP 404) |
上传或解析失败时读取响应中的 data.errors 和 msg,不要仅依据 HTTP 状态码判断失败原因。
这篇文章对你有帮助吗?