- 1. 基础信息
- 2. 基础 API
- 3. 认证与授权 API
- 4. 系统管理 API
- 5. 文本分享 API
- 6. 文件分享 API
- 7. 存储配置 API
- 8. 挂载管理 API
- 9. 文件系统 API (FS)
- 10. 目录元信息 API (FS Meta)
- 11. WebDAV API
- 12. 代理与链接解析 API
- 13. 上传相关 API
- 附录
所有 API 返回格式统一为:
{
"code": 200,
"message": "success",
"data": {},
"success": true
}使用 Bearer Token 认证,需要在请求头中添加:
Authorization: Bearer <admin_token>
管理员令牌通过 /api/admin/login 接口获取。
使用 ApiKey 认证,需要在请求头中添加:
Authorization: ApiKey <api_key>
API 密钥由管理员在后台创建,使用位标志权限系统,支持以下权限类型:
权限位标志值:
- 1 (TEXT_SHARE): 文本分享权限 - 允许创建/分享文本
- 2 (FILE_SHARE): 文件分享权限 - 允许创建/分享文件
- 4 (TEXT_MANAGE): 文本管理权限 - 允许列出/修改/删除自己的文本分享
- 8 (FILE_MANAGE): 文件管理权限 - 允许列出/修改/删除自己的文件分享
- 256 (MOUNT_VIEW): 挂载页查看权限 - 允许浏览挂载页
- 512 (MOUNT_UPLOAD): 上传权限 - 允许上传文件和创建目录
- 1024 (MOUNT_COPY): 复制权限 - 允许复制文件/目录
- 2048 (MOUNT_RENAME): 重命名权限 - 允许重命名文件/目录
- 4096 (MOUNT_DELETE): 删除权限 - 允许删除文件/目录
- 65536 (WEBDAV_READ): WebDAV 读取权限 - 允许通过 WebDAV 读取文件(GET/PROPFIND 等)
- 131072 (WEBDAV_MANAGE): WebDAV 管理权限 - 允许通过 WebDAV 管理文件(PUT/DELETE/MKCOL 等)
权限组合示例:
15= TEXT_SHARE + TEXT_MANAGE + FILE_SHARE + FILE_MANAGE (1+2+4+8)771= 基础权限 + MOUNT_UPLOAD (1+2+256+512)7939= 除 WebDAV 外的所有权限 (1+2+256+512+1024+2048+4096)204559= ALL_PERMISSIONS - 拥有所有权限
路径限制:
- basic_path: 路径权限限制 - 限制 API 密钥用户只能访问指定路径及其子路径
WebDAV 支持两种认证方式:
Basic Auth(推荐)
Authorization: Basic <base64(api_key:api_key)>
Bearer Token
Authorization: Bearer <api_key>
部分 API 还支持自定义授权头:
X-Custom-Auth-Key: <api_key>
认证失败时返回统一的错误格式:
{
"code": 401,
"message": "需要认证访问",
"success": false
}权限不足时返回:
{
"code": 403,
"message": "权限不足",
"success": false
}GET /api/health- 描述:API 健康检查端点,用于监控服务状态
- 授权:无需授权
- 响应:
{ "status": "ok", "timestamp": "2023-05-01T12:00:00Z" }
GET /api/version- 描述:获取系统版本信息
- 授权:无需授权
- 响应:包含版本号、应用名称、运行环境、存储类型、Node.js 版本和运行时间的系统信息
{ "code": 200, "message": "获取版本信息成功", "data": { "version": "0.8.1", "name": "cloudpaste-api", "environment": "Docker", "storage": "SQLite", "nodeVersion": "v18.17.0", "uptime": 3600 }, "success": true }
GET /api/public/guest-config- 描述:用于前端获取 Guest API 密钥配置,支持"游客模式"登录
- 授权:无需授权
- 响应:
{ "code": 200, "message": "游客配置获取成功", "success": true, "data": { "enabled": true, "key": "guest", "name": "guest", "permissions": 768, "permissions_detail": { "text_share": true, "file_share": true, "mount_view": true }, "basic_path": "/public", "expires_at": "9999-12-31T23:59:59Z" } }
POST /api/admin/login- 描述:管理员登录
- 授权:无需授权
- 请求体:
{ "username": "管理员用户名", "password": "管理员密码" } - 响应:
{ "code": 200, "message": "登录成功", "data": { "username": "admin", "token": "abc123def456...", "expiresAt": "2025-01-28T10:30:45.123Z" } }
POST /api/admin/logout- 描述:管理员登出
- 授权:需要管理员令牌
- 响应:登出结果
POST /api/admin/change-password- 描述:管理员修改密码
- 授权:需要管理员令牌
- 请求体:
{ "currentPassword": "当前密码", "newPassword": "新密码", "newUsername": "新用户名" } - 响应:修改结果
-
GET /api/test/admin-token- 描述:测试管理员令牌有效性
- 授权:需要管理员令牌
- 响应:
{ "code": 200, "message": "令牌有效", "success": true }
-
GET /api/test/api-key- 描述:测试 API 密钥有效性
- 授权:需要有效的 API 密钥
- 响应:
{ "code": 200, "message": "API密钥验证成功", "data": { "name": "密钥名称", "basic_path": "/", "permissions": { "text": true, "file_share": true, "mount_view": true } }, "success": true }
GET /api/admin/api-keys- 描述:获取所有 API 密钥列表
- 授权:需要管理员令牌
- 响应:API 密钥列表,包含每个密钥的权限和使用情况
POST /api/admin/api-keys- 描述:创建新的 API 密钥
- 授权:需要管理员令牌
- 请求体:
{ "name": "密钥名称", "permissions": 7, "role": "GENERAL", "basic_path": "/", "is_guest": false, "expires_at": "2023-12-31T23:59:59Z", "custom_key": "custom-api-key-123" } - 响应:新创建的 API 密钥信息,包含完整的密钥值(仅在创建时返回)
PUT /api/admin/api-keys/:id- 描述:更新 API 密钥
- 授权:需要管理员令牌
- 参数:id - 密钥 ID
- 请求体:与创建接口类似,所有字段均为可选
- 响应:更新后的密钥信息
DELETE /api/admin/api-keys/:id- 描述:删除 API 密钥
- 授权:需要管理员令牌
- 参数:id - 密钥 ID
- 响应:删除结果
GET /api/admin/api-keys/:id/storage-acl- 描述:获取指定 API 密钥的存储 ACL 白名单
- 授权:需要管理员令牌
- 参数:id - 密钥 ID
- 响应:
{ "code": 200, "message": "获取存储 ACL 成功", "data": { "subject_type": "API_KEY", "subject_id": "密钥ID", "storage_config_ids": ["config-id-a", "config-id-b"] }, "success": true }
PUT /api/admin/api-keys/:id/storage-acl- 描述:整体更新指定 API 密钥的存储 ACL 白名单
- 授权:需要管理员令牌
- 参数:id - 密钥 ID
- 请求体:
{ "storage_config_ids": ["config-id-a", "config-id-b"] } - 响应:更新后的存储 ACL 信息
GET /api/admin/settings- 描述:获取系统设置(支持按分组查询或获取所有分组)
- 授权:无需授权(公开访问)
- 查询参数:
group- 分组 ID(可选):1=全局设置,3=WebDAV 设置metadata- 是否包含元数据(可选,默认 true)includeSystem- 是否包含系统内部分组(可选,默认 false)
- 响应:按分组返回设置列表或所有分组的设置
GET /api/admin/settings/groups- 描述:获取分组列表和统计信息
- 授权:需要管理员令牌
- 响应:分组信息列表
GET /api/admin/settings/metadata- 描述:获取设置项元数据
- 授权:需要管理员令牌
- 查询参数:
key- 设置键名(必填)
- 响应:设置项的详细元数据
PUT /api/admin/settings/group/:groupId- 描述:按分组批量更新设置
- 授权:需要管理员令牌
- 参数:groupId - 分组 ID
- 查询参数:
validate- 是否进行类型验证(可选,默认 true)
- 请求体:设置键值对
{ "max_upload_size": 200, "default_paste_expiry": 14 } - 响应:批量更新结果
GET /api/system/max-upload-size- 描述:获取系统允许的最大上传文件大小(公共 API)
- 授权:无需授权
- 响应:
{ "code": 200, "message": "获取最大上传大小成功", "data": { "max_upload_size": 100 }, "success": true }
GET /api/admin/dashboard/stats- 描述:获取管理员仪表盘统计数据
- 授权:需要管理员令牌
- 响应:系统统计数据,包含文本和文件使用情况、用户活跃度和系统性能指标
GET /api/admin/cache/stats- 描述:获取系统监控信息,包括缓存统计和系统内存信息
- 授权:需要管理员令牌
- 响应:缓存统计和系统信息
POST /api/admin/cache/clear- 描述:清理系统缓存(支持目录缓存、URL 缓存和搜索缓存)
- 授权:需要管理员令牌
- 请求体:
{ "mountId": "挂载点ID", "storageConfigId": "存储配置ID" } - 响应:清理结果
POST /api/user/cache/clear- 描述:API 密钥用户清理缓存(仅限其权限范围内的缓存)
- 授权:需要有挂载权限的 API 密钥
- 请求体:
{ "mountId": "挂载点ID", "cacheType": "all" } - 响应:清理结果
说明:FS 搜索为 Index-only(不做实时遍历兜底)。
scope=global:仅搜索 索引状态为 ready 的挂载点;未就绪/不想索引/暂不可索引的挂载点会被跳过(不会阻塞全局搜索),并通过indexPartial/skippedMounts返回结构化信息。scope=mount|directory:目标挂载点索引未就绪时,返回indexReady=false+hint,不返回“看似完整但实际不完整”的结果。
GET /api/admin/fs/index/status- 描述:获取每个挂载点的索引状态,并返回当前运行中的索引重建作业(若存在)
- 授权:需要管理员令牌
- 响应字段补充:
dirtyCount:该挂载点待消费的 dirty 条目数(用于判断是否需要 apply-dirty)recommendedAction:后端建议动作(仅建议,不会自动执行)none:无需操作wait:索引作业执行中,建议等待apply-dirty:建议触发增量应用rebuild:建议触发全量重建
recommendedReason:建议原因(可选)indexing/index_not_ready/dirty_pending/dirty_too_large
- 响应 hints:
hints.minQueryLength:索引搜索最小字符数(当前为 3,trigram contains)hints.dirtyRebuildThreshold:dirty 条目过大时建议 rebuild 的阈值(当前为 5000)
POST /api/admin/fs/index/rebuild- 描述:创建
fs_index_rebuild异步作业,遍历挂载点并重建索引 - 授权:需要管理员令牌
- 请求体(可选):
{ "mountIds": ["mountId1", "mountId2"], "options": { "batchSize": 200, "maxDepth": null, "maxMountsPerRun": null } }
- 描述:创建
POST /api/admin/fs/index/stop- 描述:取消索引重建作业
- 授权:需要管理员令牌
- 请求体:
{ "jobId": "fs_index_rebuild_xxx" }
POST /api/admin/fs/index/clear- 描述:清空索引派生数据(entries/state/dirty/fts),并将索引视为未就绪(需重建)
- 授权:需要管理员令牌
- 请求体(可选):
{ "mountIds": ["mountId1", "mountId2"] }
POST /api/admin/fs/index/apply-dirty- 描述:创建
fs_index_apply_dirty异步作业,消费 dirty 队列以更新索引 - 授权:需要管理员令牌
- 请求体(可选):
{ "mountIds": ["mountId1", "mountId2"], "options": { "batchSize": 200, "maxItems": null, "rebuildDirectorySubtree": true, "maxDepth": null } }
- 描述:创建
POST /api/admin/backup/create- 描述:创建系统数据备份
- 授权:需要管理员令牌
- 说明:
- FS 搜索索引(
fs_search_index_*)属于派生数据,备份默认排除;恢复后需管理员触发重建。 - D1/SQLite 的 FTS5 虚表不适合依赖 export/import 作为事实来源,建议按“可重建索引”策略运维。
- FS 搜索索引(
- 请求体:
{ "backup_type": "full", "selected_modules": [] } - 响应:备份文件(JSON格式),通过 Content-Disposition 头触发下载
POST /api/admin/backup/restore- 描述:从备份文件还原系统数据
- 授权:需要管理员令牌
- 请求体:FormData 格式
backup_file- 备份文件(必填)mode- 还原模式(可选,默认 overwrite)
- 响应:还原结果
- 响应字段补充:
integrity_issues:数据完整性问题列表(warning 级别,用于前端“操作日志”展示;不一定会阻断 restore)
POST /api/admin/backup/restore/preview- 描述:对备份文件做“预检查/预估”,不会写入数据库;用于避免 overwrite 先清表后失败
- 授权:需要管理员令牌
- 请求体:FormData 格式
backup_file- 备份文件(必填)mode- 还原模式(可选,默认 overwrite)skipIntegrityCheck- 是否跳过跨表依赖检查(可选,默认 false)preserveTimestamps- 是否保留时间戳(可选,默认 false)
- 响应字段(关键):
ok:是否通过(true/false)preview.issues:问题列表(level=error 时不建议继续 restore)preview.plan.estimated:预估语句数/批次数(用于判断大备份耗时)
GET /api/admin/backup/modules- 描述:获取可备份的模块列表和信息
- 授权:需要管理员令牌
- 响应:模块信息列表
-
GET /api/admin/scheduled/types- 描述:列出所有可用的定时任务处理器类型(可用于前端下拉/配置引导)
- 授权:需要管理员令牌
- 响应:
{ items: [...] }
-
GET /api/admin/scheduled/types/:taskId- 描述:获取单个处理器类型详情
- 授权:需要管理员令牌
- 参数:taskId - 处理器类型 ID
- 响应:处理器详情
-
GET /api/admin/scheduled/jobs- 描述:列出调度作业
- 授权:需要管理员令牌
- 查询参数(可选):
taskId/task_id- 仅返回指定 taskId 的作业enabled- 过滤启用状态(true/false/1/0/yes/no/on/off)
- 响应:
{ items: [...] }
-
GET /api/admin/scheduled/jobs/:taskId- 描述:获取单个调度作业详情
- 授权:需要管理员令牌
- 参数:taskId - 作业 ID
-
POST /api/admin/scheduled/jobs- 描述:创建调度作业
- 授权:需要管理员令牌
- 请求体示例(字段支持 camelCase 与 snake_case):
{ "taskId": "jobId-xxx", "handlerId": "handler-xxx", "name": "可选", "description": "可选", "scheduleType": "cron", "intervalSec": 60, "cronExpression": "*/5 * * * *", "enabled": true, "config": {} } - 响应:创建后的作业详情
-
PUT /api/admin/scheduled/jobs/:taskId- 描述:更新调度作业(请求体为“部分更新”,只传需要改的字段即可)
- 授权:需要管理员令牌
- 参数:taskId - 作业 ID
-
DELETE /api/admin/scheduled/jobs/:taskId- 描述:删除调度作业
- 授权:需要管理员令牌
- 参数:taskId - 作业 ID
-
GET /api/admin/scheduled/jobs/:taskId/runs- 描述:获取某个作业的运行记录
- 授权:需要管理员令牌
- 参数:taskId - 作业 ID
- 查询参数(可选):
limit- 返回条数(不传则由后端决定默认值)
- 响应:
{ items: [...] }
-
GET /api/admin/scheduled/analytics- 描述:获取定时任务运行的按小时统计数据
- 授权:需要管理员令牌
- 查询参数(可选):
windowHours- 统计窗口(小时)
GET /api/admin/scheduled/ticker- 描述:获取“外部触发器”的状态(用于管理面板显示“预计下次触发时间”)
- 授权:需要管理员令牌
- 响应字段(关键):
runtime:cloudflare|dockercron.active: 当前用于计算 next 的 cron(优先使用 lastSeen;Docker 环境会回退到配置值/默认值)lastTick.ms/at: 最近一次“真实触发”的时间(来自 system_settings)nextTick.at: 按 cron 规则算出来的“预计下次触发时间”(注意:不保证精确到秒,平台可能延迟)
- 说明:
- Cloudflare 环境在“首次真实触发”之前可能无法计算 nextTick,会返回“等待首次触发”的提示
POST /api/admin/scheduled/jobs/:taskId/run- 描述:立刻手动执行一次该任务,并写入运行记录(triggerType=manual)
- 授权:需要管理员令牌
- 参数:taskId - 作业 ID
POST /api/paste- 描述:创建新的文本分享
- 授权:需要管理员令牌或有文本权限的 API 密钥
- 请求体:
{ "content": "要分享的文本内容", "title": "文本标题", "remark": "备注信息", "expires_at": "2023-12-31T23:59:59Z", "max_views": 100, "password": "访问密码", "slug": "custom-slug", "is_public": true } - 响应:创建的文本分享信息,包含访问链接
-
GET /api/paste/:slug- 描述:获取文本分享内容
- 参数:slug - 文本短链接
- 授权:无需授权(受 is_public、过期时间、最大查看次数和密码保护限制)
- 响应:文本分享内容或元信息(如设置了密码)
-
POST /api/paste/:slug- 描述:使用密码获取受保护的文本分享
- 参数:slug - 文本短链接
- 请求体:
{ "password": "访问密码" } - 响应:验证成功后返回文本分享内容
-
GET /api/raw/:slug- 描述:获取文本分享的原始内容(纯文本格式)
- 参数:slug - 文本短链接
- 查询参数:
password- 如果文本受密码保护,需提供密码
- 响应:纯文本格式的内容
背景:浏览器侧的
<img src>/ 资源请求通常无法携带Authorization请求头。
因此这里用“短期 ticket”来让前端能安全地代理拉取 URL 内容。
POST /api/paste/url/proxy-ticket- 描述:签发一个短期 ticket,供
/api/paste/url/proxy使用 - 授权:需要管理员令牌或具备文本创建权限的 API 密钥(pastes.create)
- 响应示例:
{ "ticket": "xxx", "expiresIn": 60, "expiresAt": "2025-12-20T12:00:00.000Z" }
- 描述:签发一个短期 ticket,供
GET /api/paste/url/proxy- 描述:代理指定 URL 的内容(通常用于不支持 CORS 的资源)
- 授权:无需 Authorization,但必须提供有效 ticket
- 查询参数:
url- 要代理的 URL(必填)ticket- 代理票据(必填,由/api/paste/url/proxy-ticket获取)
- 响应:原始 URL 的内容流(Content-Type 由上游决定)
PUT /api/pastes/:slug- 描述:更新文本信息
- 授权:需要管理员令牌或有文本权限的 API 密钥
- 参数:slug - 文本短链接
- 请求体:
{ "content": "更新后的文本内容", "title": "更新后的标题", "remark": "更新后的备注信息", "expires_at": "2024-01-31T23:59:59Z", "max_views": 50, "password": "新密码", "clearPassword": true, "newSlug": "new-slug", "is_public": false } - 响应:更新后的文本信息
DELETE /api/pastes/batch-delete- 描述:批量删除文本
- 授权:需要管理员令牌或有文本权限的 API 密钥
- 请求体:
{ "ids": ["文本ID1", "文本ID2", "文本ID3"] } - 响应:批量删除结果
-
GET /api/pastes- 描述:获取文本分享列表
- 授权:需要管理员令牌或有文本权限的 API 密钥
- 查询参数:
page- 页码(管理员用户)limit- 每页数量offset- 偏移量(API 密钥用户)created_by- 按创建者筛选(管理员用户)
- 响应:文本分享列表和分页信息
-
GET /api/pastes/:id- 描述:获取单个文本详情
- 授权:需要管理员令牌或有文本权限的 API 密钥
- 参数:id - 文本 ID
- 响应:文本分享详细信息
POST /api/pastes/clear-expired- 描述:清理过期文本(管理员专用)
- 授权:需要管理员令牌
- 响应:清理结果
-
GET /api/share/get/:slug- 描述:获取分享文件公开信息(控制面 JSON)
- 参数:slug - 文件短链接
- 授权:无需授权
- 响应:包含文件基本信息 + 语义明确的
previewUrl/downloadUrl/linkType等字段;若文件需要密码且未验证,则previewUrl/downloadUrl为 null。
-
POST /api/share/verify/:slug- 描述:验证文件访问密码(成功后返回同 GET 的公开视图)
- 参数:slug - 文件短链接
- 请求体:
{ "password": "文件密码" } - 响应:验证成功后返回包含
previewUrl/downloadUrl的文件信息
GET /api/files- 描述:获取文件列表
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
limit- 每页数量(默认 30)offset- 偏移量(默认 0)created_by- 按创建者筛选(管理员用户)
- 响应:文件列表和分页信息
GET /api/files/:id- 描述:获取单个文件详情
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 参数:id - 文件 ID
- 查询参数(可选):
include=links- 返回链接信息(previewUrl/downloadUrl/linkType/documentPreview)links=true- 兼容写法,等价include=links
- 响应:
- 默认:仅返回文件元信息(不包含任何链接字段)
include=links时:在元信息基础上额外返回previewUrl(预览入口)、downloadUrl(下载入口)、linkType(direct/url_proxy/proxy)以及documentPreview
PUT /api/files/:id- 描述:更新文件信息
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 参数:id - 文件 ID
- 请求体:可包含 remark, slug, expires_at, max_views, password, use_proxy 等字段
- 响应:更新后的文件信息
DELETE /api/files/batch-delete- 描述:批量删除文件
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "ids": ["文件ID1", "文件ID2"], "delete_mode": "both" } - 响应:批量删除结果
-
POST /api/share/presign- 描述:为"上传即分享"生成预签名上传地址
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "filename": "文件名", "fileSize": 123456, "contentType": "video/mp4", "path": "/share/path", "storage_config_id": "uuid" } - 响应:预签名上传 URL 和相关信息
-
POST /api/share/commit- 描述:在预签名 PUT 完成后,创建分享记录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "key": "对象存储键", "storage_config_id": "uuid", "filename": "文件名", "size": 123456, "slug": "自定义短链", "password": "访问密码", "expires_in": 24, "max_views": 100 } - 响应:完整的分享记录
POST /api/share/upload- 描述:通过 multipart/form-data 上传文件并立即创建分享记录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- Content-Type:
multipart/form-data - 表单字段:file, storage_config_id, path, slug, remark, password, expires_in, max_views, use_proxy, original_filename, upload_id
- 响应:创建好的分享记录
PUT /api/share/upload- 描述:通过流式 PUT 上传文件并创建分享记录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求头:
Content-Type- 文件 MIME 类型Content-Length- 文件大小X-Share-Filename- 文件名(必填)X-Share-Options- base64(JSON) 的分享参数
- 请求体:文件原始字节流
- 响应:创建好的分享记录
-
GET /api/s/:slug- 描述:Share 本地代理内容入口(等价 FS 的本地代理语义),用于同源预览/下载
- 参数:slug - 文件短链接
- 授权:无需授权(受密码保护、过期时间、浏览次数限制)
- 查询参数:
password- 文件密码(文件受密码保护时必填)down- 下载语义开关(true/1表示下载;不传或false表示预览)mode- 旧版兼容参数(attachment/download等价down=true,inline等价预览;新代码不推荐使用)
- 响应:同源 200 文件内容流(始终后端代理,不做 302 外跳),支持 Range 断点续传/媒体流播放
- 说明:直链 / url_proxy / Worker 等决策只体现在
/api/share/get/:slug返回的previewUrl/downloadUrl/linkType上;/api/s/:slug永远走本地代理
-
GET /api/share/content/:slug- 描述:分享文件同源内容口(文本预览/编码检测专用)
- 参数:slug - 文件短链接
- 授权:无需授权(受密码保护、过期时间、浏览次数限制)
- 查询参数:
password- 文件密码(文件受密码保护时必填)
- 响应:同源 200 文件内容流(预览语义),支持 Range;不做 302 外跳
GET /api/storage- 描述:获取存储配置列表
- 授权:需要管理员令牌或具有
s3.config.read权限的 API 密钥 - 查询参数:
page- 页码(管理员)limit- 每页数量(管理员,默认 10)
- 响应:存储配置列表(管理员获取全部,API 密钥用户仅获取公开+ACL白名单内的配置)
GET /api/storage/:id- 描述:获取指定存储配置详情
- 授权:需要管理员令牌或具有权限的 API 密钥
- 参数:id - 存储配置 ID
- 查询参数:
reveal-plain/masked(仅管理员),控制密钥字段显示方式
- 响应:存储配置详情
POST /api/storage- 描述:创建新的存储配置(管理员)
- 授权:需要管理员令牌
- 请求体:
{ "name": "配置名称", "storage_type": "S3", "provider_type": "Cloudflare R2", "endpoint_url": "https://xxxx.r2.cloudflarestorage.com", "bucket_name": "my-bucket", "access_key_id": "ACCESS_KEY", "secret_access_key": "SECRET_KEY", "region": "auto", "path_style": false, "default_folder": "uploads/", "is_public": true, "total_storage_bytes": 10737418240 } - 响应:新创建的存储配置
PUT /api/storage/:id- 描述:更新存储配置(管理员)
- 授权:需要管理员令牌
- 参数:id - 存储配置 ID
- 请求体:与创建接口类似,所有字段均为可选
- 响应:更新成功状态
DELETE /api/storage/:id- 描述:删除存储配置(管理员)
- 授权:需要管理员令牌
- 参数:id - 存储配置 ID
- 响应:删除结果
PUT /api/storage/:id/set-default- 描述:设置默认存储配置(管理员)
- 授权:需要管理员令牌
- 参数:id - 存储配置 ID
- 响应:设置结果
POST /api/storage/:id/test- 描述:测试存储配置连接有效性(管理员)
- 授权:需要管理员令牌
- 参数:id - 存储配置 ID
- 响应:测试结果,包含连接状态和详细信息
GET /api/storage-types/:type/capabilities- 描述:获取指定存储类型支持的能力列表及元数据
- 授权:需要管理员令牌或有挂载权限的 API 密钥
- 参数:type - 存储类型(如 S3、WEBDAV 等)
- 响应:存储类型的能力信息
GET /api/storage-types- 描述:获取所有注册的存储类型及其能力与配置元数据信息
- 授权:需要管理员令牌或有挂载权限的 API 密钥
- 响应:所有存储类型的元数据列表
GET /api/mount-schema- 描述:获取挂载点表单的Schema定义,供前端动态渲染表单
- 授权:需要管理员令牌
- 响应:挂载点配置的JSON Schema
GET /api/mount/list- 描述:获取挂载点列表
- 授权:需要管理员令牌或有挂载权限的 API 密钥
- 响应:挂载点列表和详细信息
- 权限说明:
- 管理员用户:返回所有挂载点(包括禁用的)
- API 密钥用户:只返回 basic_path 权限范围内的活跃挂载点
POST /api/mount/create- 描述:创建新的挂载点(仅管理员)
- 授权:需要管理员令牌
- 请求体:
{ "name": "挂载点名称", "storage_type": "S3", "storage_config_id": "S3配置ID", "mount_path": "/mount-path", "remark": "挂载点备注", "is_active": true, "sort_order": 0, "cache_ttl": 300, "web_proxy": false, "webdav_policy": "302_redirect", "enable_sign": false, "sign_expires": null } - 响应:新创建的挂载点信息
PUT /api/mount/:id- 描述:更新挂载点信息(仅管理员)
- 授权:需要管理员令牌
- 参数:id - 挂载点 ID
- 请求体:包含需要更新的字段,格式同创建
- 响应:更新结果
DELETE /api/mount/:id- 描述:删除挂载点(仅管理员)
- 授权:需要管理员令牌
- 参数:id - 挂载点 ID
- 响应:删除结果
GET /api/fs/list- 描述:列出目录内容
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
path- 要列出内容的目录路径,默认为根目录("/")path_token- 路径密码验证令牌(可选;等价请求头X-FS-Path-Token)
- 请求头(可选):
X-FS-Path-Token- 路径密码验证令牌(访问受密码保护的目录时需要;也可用path_token传递)
- 响应:目录内容列表,包含文件和子目录信息
GET /api/fs/get- 描述:获取文件信息
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
path- 文件路径path_token- 路径密码验证令牌(可选;等价请求头X-FS-Path-Token)
- 请求头(可选):
X-FS-Path-Token- 路径密码验证令牌(访问受密码保护的目录时需要;也可用path_token传递)
- 响应:文件详细信息 + 语义明确的
previewUrl/downloadUrl/linkType/documentPreview字段
GET /api/fs/download- 描述:下载文件(attachment 语义,优先外部入口)
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
path- 文件路径path_token- 路径密码验证令牌(可选;等价请求头X-FS-Path-Token)
- 请求头(可选):
X-FS-Path-Token- 路径密码验证令牌(访问受密码保护的目录时需要;也可用path_token传递)
- 响应:
- 若可生成外部下载入口(直链 / url_proxy / 本地代理),返回
302重定向到该 URL - 否则回退为同源
200流式下载(支持 Range)
- 若可生成外部下载入口(直链 / url_proxy / 本地代理),返回
GET /api/fs/content- 描述:同源返回 FS 文件原始内容(预览/文本编码检测专用,后端代理)
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
path- 文件路径(必填)path_token- 路径密码验证令牌(可选;等价请求头X-FS-Path-Token)
- 请求头(可选):
X-FS-Path-Token- 路径密码验证令牌(访问受密码保护的目录时需要;也可用path_token传递)
- 响应:同源
200文件内容流(预览语义),支持 Range;不做302外跳
GET /api/fs/file-link- 描述:获取文件外部访问链接(直链 / url_proxy / 代理入口)
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
path- 文件路径(必填)expires_in- 链接有效期(秒),默认为 604800(7 天)force_download- 是否强制下载,true 或 false(默认 false)path_token- 路径密码验证令牌(可选;等价请求头X-FS-Path-Token)
- 请求头(可选):
X-FS-Path-Token- 路径密码验证令牌(访问受密码保护的目录时需要;也可用path_token传递)
- 响应:
{ "url": "最终可访问 URL", "linkType": "direct|url_proxy|proxy" }
POST /api/fs/create-share- 描述:把一个 FS 文件“转换成分享链接”(不复制文件,只创建分享记录)
- 授权:需要管理员令牌或有分享创建权限的 API 密钥(fs.share.create)
- 请求体:
{ "path": "/mount/path/file.ext" } - 响应:分享记录(包含 slug 等信息)
POST /api/fs/mkdir- 描述:创建目录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "要创建的目录路径" } - 响应:创建结果
PUT /api/fs/upload- 描述:通过流式方式上传文件(推荐)
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
path- 目标文件路径(必填)upload_id- 上传进度 ID(可选)
- 请求头:
Content-Type- 文件 MIME 类型Content-Length- 文件大小X-FS-Filename- 文件名(可选)X-FS-Options- base64(JSON) 编码的上传行为参数
- 请求体:文件原始字节流
- 响应:上传结果
POST /api/fs/upload- 描述:通过 multipart/form-data 表单上传文件
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:FormData 格式
file- 文件内容(必填)path- 上传目标路径(必填)upload_id- 上传进度 ID(可选)overwrite- 是否覆盖同名文件(可选)original_filename- 是否保留原始文件名(可选)
- 响应:上传结果
POST /api/fs/update- 描述:更新文件内容或创建新文件
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "文件路径", "content": "文件内容" } - 响应:更新结果
POST /api/fs/rename- 描述:重命名文件或目录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "oldPath": "原路径", "newPath": "新路径" } - 响应:重命名结果
DELETE /api/fs/batch-remove- 描述:批量删除文件或目录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "paths": ["路径1", "路径2", "..."] } - 响应:批量删除结果
POST /api/fs/batch-copy- 描述:批量复制文件或目录,创建异步复制作业
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "items": [ { "sourcePath": "源路径1", "targetPath": "目标路径1" } ], "skipExisting": false } - 响应:作业 ID 和初始状态
GET /api/fs/search- 描述:搜索文件和目录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
q- 搜索关键词(必填,至少 3 个字符)scope- 搜索范围(可选,默认为"global"):global / mount / directorymount_id- 挂载点 ID(当 scope 为"mount"时必填)path- 搜索路径(当 scope 为"directory"时必填)limit- 结果数量限制(可选,默认 50,最大 200)cursor- 分页游标(可选,不透明字符串;由上一次响应的nextCursor提供)
- 响应:搜索结果列表(Index-only)
indexReady:是否存在可用索引并已执行索引检索scope=global:只要有至少一个ready挂载点即可为 true(未就绪挂载点会跳过)scope=mount|directory:目标挂载点未ready时为 false
indexPartial:是否为“部分挂载点可搜索”(仅scope=global可能为 true)searchableMountIds:本次实际参与索引检索的挂载点 ID 列表skippedMounts:本次被跳过的挂载点信息(仅scope=global返回非空)mountId:挂载点 IDstatus:索引状态(ready/indexing/error/not_ready)reason:跳过原因(当前固定为index_not_ready)
indexNotReadyMountIds:索引未就绪的挂载点 ID 列表(兼容字段;scope=global等同于 skippedMounts 的 mountId 集合)hint:索引不可用时的提示信息(引导管理员触发重建)nextCursor:下一页游标(为 null 表示无更多结果)
POST /api/fs/presign- 描述:获取预签名上传 URL
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "上传目标路径", "fileName": "文件名.jpg", "contentType": "文件MIME类型", "fileSize": 1024000 } - 响应:包含预签名 URL 和上传配置的对象
POST /api/fs/presign/commit- 描述:提交预签名上传,确认文件上传完成
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "targetPath": "上传目标路径", "mountId": "挂载点ID", "fileSize": 1024000 } - 响应:文件上传完成状态和文件信息
POST /api/fs/multipart/init- 描述:初始化分片上传
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "上传目标路径", "contentType": "文件MIME类型", "filename": "文件名.jpg" } - 响应:初始化信息,包含 uploadId 和其他元数据
PUT /api/fs/multipart/upload-chunk- 描述:前端分片上传的“中转端点”(主要用于 Google Drive resumable 会话)。浏览器把分片发到这里,后端再转发到上游。
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
upload_id- 上传会话 ID(必填)
- 请求头:
Content-Range- 分片范围(必填)Content-Length- 分片大小(建议)
- 请求体:分片内容(二进制)
- 响应示例:
{ "success": true, "done": false, "status": 200 }
POST /api/fs/multipart/complete- 描述:完成分片上传
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "上传目标路径", "uploadId": "分片上传ID", "parts": [ { "PartNumber": 1, "ETag": "分片1的ETag" } ], "key": "S3存储键值" } - 响应:上传完成结果
POST /api/fs/multipart/abort- 描述:中止分片上传
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "上传目标路径", "uploadId": "分片上传ID", "key": "S3存储键值" } - 响应:中止结果
POST /api/fs/multipart/list-uploads- 描述:列出指定路径下进行中的分片上传
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "/uploads" } - 响应:进行中的分片上传列表
POST /api/fs/multipart/list-parts- 描述:列出指定上传任务已上传的分片
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "上传目标路径", "uploadId": "upload-uuid-123", "fileName": "文件名.mp4" } - 响应:已上传的分片列表
POST /api/fs/multipart/refresh-urls- 描述:刷新指定分片的预签名上传URL(当URL过期时使用)
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 请求体:
{ "path": "上传目标路径", "uploadId": "upload-uuid-123", "partNumbers": [3, 4, 5] } - 响应:新的预签名URL列表
GET /api/fs/job-types- 描述:返回“当前用户可见”的作业类型清单(用于前端动态展示可创建的任务)
- 授权:需要管理员令牌或有挂载访问权限的 API 密钥(fs.base)
- 响应示例:
{ "types": [ { "taskType": "copy", "i18nKey": "fs.jobs.copy", "displayName": "复制", "category": "fs", "capabilities": [] } ] }
POST /api/fs/jobs- 描述:创建通用作业(任务队列入口)
- 授权:
taskType=copy:需要管理员令牌或有文件权限的 API 密钥taskType=fs_index_rebuild:仅管理员令牌(索引重建属于管理员操作)
- 请求体(推荐通用格式):
{ "taskType": "copy", "payload": { "items": [ { "sourcePath": "源路径1", "targetPath": "目标路径1" } ], "options": { "skipExisting": false, "maxConcurrency": 10 } } } - 请求体(copy 兼容格式,旧客户端):
{ "taskType": "copy", "items": [ { "sourcePath": "源路径1", "targetPath": "目标路径1" } ], "skipExisting": false, "maxConcurrency": 10 } - 请求体(fs_index_rebuild,管理员):
{ "taskType": "fs_index_rebuild", "payload": { "mountIds": ["mountId1", "mountId2"], "options": { "batchSize": 200, "maxDepth": null, "maxMountsPerRun": null } } } - 响应:作业描述符
GET /api/fs/jobs/:jobId- 描述:获取指定作业的状态和进度
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 参数:jobId - 作业 ID
- 响应:作业状态详情
POST /api/fs/jobs/:jobId/cancel- 描述:取消正在运行的作业
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 参数:jobId - 作业 ID
- 响应:取消结果
GET /api/fs/jobs- 描述:列出作业列表(支持筛选)
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 查询参数:
taskType- 任务类型(可选)status- 作业状态(可选)limit- 每页数量(可选,默认 20)offset- 偏移量(可选,默认 0)
- 响应:作业列表
DELETE /api/fs/jobs/:jobId- 描述:删除已完成或已取消的作业记录
- 授权:需要管理员令牌或有文件权限的 API 密钥
- 参数:jobId - 作业 ID
- 响应:删除结果
GET /api/fs-meta/list- 描述:获取所有目录元信息配置列表
- 授权:需要管理员令牌
- 响应:目录元信息配置列表
GET /api/fs-meta/:id- 描述:获取单条目录元信息配置
- 授权:需要管理员令牌
- 参数:id - 元信息记录 ID
- 响应:元信息配置详情
POST /api/fs-meta/create- 描述:为指定路径创建新的目录元信息配置
- 授权:需要管理员令牌
- 请求体:
{ "path": "/claw", "headerMarkdown": "# 目录说明", "headerInherit": true, "footerMarkdown": "", "footerInherit": false, "hidePatterns": ["^README\\.md$"], "hideInherit": true, "password": "1234", "passwordInherit": true } - 响应:新创建的元信息配置
PUT /api/fs-meta/:id- 描述:更新指定 ID 的目录元信息配置
- 授权:需要管理员令牌
- 参数:id - 元信息记录 ID
- 请求体:与创建接口类似,所有字段均为可选
- 响应:更新后的元信息配置
DELETE /api/fs-meta/:id- 描述:删除指定 ID 的目录元信息记录
- 授权:需要管理员令牌
- 参数:id - 元信息记录 ID
- 响应:删除结果
POST /api/fs/meta/password/verify- 描述:验证目录路径密码,获取访问令牌
- 授权:无需授权(公开访问)
- 请求体:
{ "path": "/protected/directory", "password": "directory-password" } - 响应:验证成功后返回访问令牌
- WebDAV端点:
/dav- 描述:WebDAV 协议接入点,提供标准 WebDAV 协议访问
- 支持的 WebDAV 方法:
GET- 获取文件内容PUT- 上传文件DELETE- 删除文件PROPFIND- 获取文件/目录属性PROPPATCH- 修改属性MKCOL- 创建目录COPY- 复制文件/目录MOVE- 移动文件/目录LOCK- 锁定资源UNLOCK- 解锁资源
- 授权:基本 HTTP 认证(Basic Auth)或 Bearer 令牌认证
- Basic Auth: 使用 API 密钥(用户名和密码相同设置为 API 密钥值)或管理员凭据
- Bearer Auth: 使用 API 密钥值或管理员令牌
- 权限要求:
- 管理员账户:自动拥有所有操作权限
- API 密钥:需要具有挂载权限(mount_permission)
POST /api/proxy/link- 描述:统一存储链接解析接口
- 授权:支持管理员令牌、API 密钥或匿名访问
- 请求体:
或
{ "type": "fs", "path": "/mount/path/file.ext" }{ "type": "share", "slug": "file-slug" } - 响应:
{ "code": 200, "data": { "url": "https://storage.example.com/file.ext", "header": { "Authorization": ["Bearer token"], "Content-Type": ["application/octet-stream"] } } } - 说明:
type = "fs"- 使用 path 解析挂载视图(包含 WebDAV)type = "share"- 使用 slug 解析分享视图- 反向代理/Proxy 服务调用此接口获取
{ url, header },然后直接向 url 发起请求
GET /api/p/*- 描述:文件系统代理访问路由(web_proxy 功能)
- 路径格式:
/api/p/mount/path/file.ext - 授权:根据挂载点配置决定是否需要签名验证
- 查询参数:
download- 是否强制下载(可选,默认 false)sign- 签名参数(当挂载点启用签名时必填)
- 响应:文件内容流
- 说明:
- 专门用于 web_proxy 功能的文件代理访问
- 支持 Range 请求,实现断点续传和视频流播放
- 当挂载点配置
enable_sign = true时,需要提供有效签名 - 签名验证失败返回 401 Unauthorized
- 所有访问会记录审计日志
GET /api/upload/progress- 描述:查询指定上传任务的进度
- 授权:无需认证
- 查询参数:
upload_id- 上传任务 ID(推荐)id- 兼容参数名,与 upload_id 等价
- 响应:
{ "code": 200, "message": "获取上传进度成功", "success": true, "data": { "id": "a4c0e0c8-7e6a-4f21-9a2b-123456789abc", "loaded": 25165824, "total": 47444227, "completed": false, "path": "/mount/path/file.webm", "storageType": "S3", "updatedAt": 1763964944868 } }
PUT /api/upload-direct/:filename- 描述:把文件数据直接上传到存储,并立刻创建分享记录(一次请求完成“上传 + 分享”)
- 授权:需要管理员令牌或具备文件创建权限的 API 密钥(files.create)
- 路径参数:
filename- 文件名(必填)
- 查询参数(可选,按需使用):
storage_config_id- 指定存储配置 IDpath- 指定存储子路径/目录(不同存储驱动含义可能不同)slug- 自定义分享 slugremark- 备注password- 分享访问密码expires_in- 过期时间(单位:小时)max_views- 最大访问次数override- 是否覆盖同名(true/false)use_proxy- 是否使用代理模式(true/false)original_filename- 是否保留原始文件名(true/false)upload_id- 上传进度 ID(可选,用于/api/upload/progress)
- 请求头:
Content-Type- 文件 MIME 类型(建议提供)Content-Length- 文件大小(建议提供)
- 请求体:文件原始字节流
- 响应:返回与
/api/share/get/:slug对齐的“公开文件信息”(包含previewUrl/downloadUrl/linkType/documentPreview等字段)
POST /api/share/url/info- 描述:验证 URL 并获取文件元信息
- 授权:无需授权
- 请求体:
{ "url": "https://example.com/image.jpg" } - 响应:包含 URL 文件的元信息
GET /api/share/url/proxy- 描述:代理 URL 内容,用于不支持 CORS 的资源
- 授权:无需授权
- 查询参数:
url- 要代理的 URL(必填)
- 响应:原始 URL 的内容流
所有 API 在出错时返回统一的错误格式:
{
"code": 400,
"message": "错误描述",
"success": false
}常见 HTTP 状态码:
200- 成功201- 创建成功400- 请求参数错误401- 未授权403- 权限不足404- 资源不存在409- 资源冲突410- 资源已过期500- 服务器内部错误
支持分页的 API 通常使用以下参数:
limit- 每页数量,默认 30offset- 偏移量,默认 0page- 页码(部分 API 使用)
- 最大文件大小由系统设置决定,可通过
/api/system/max-upload-size查询 - 大文件建议使用分片上传或预签名 URL 上传
- API 密钥用户受 basic_path 路径限制
- 系统使用目录缓存提高性能
- 管理员和 API 密钥用户都可以手动清理缓存
- 文件操作会自动清理相关缓存
- 搜索结果会被缓存 5 分钟