# API 概述 文件快传 Go 版(26.9)对外提供一套 REST API,覆盖文本/文件分享、分片上传、 预签名直传、管理后台与审计日志查询。 ## 更新日志 - **v3.2**:上下行带宽限速(`upload_rate` / `download_rate`,详见《[带宽限速](13-bandwidth.md)》) - v3.1:站点对外域名(`site_domain`)、自定义提取码(5~8 位)本文档与 `server/internal/api/` 实际实现逐一对齐, 交互式规范见站内 `/openapi`(源文件 `docs/openapi.yaml`)。 ## Base URL - 服务默认监听 `:8466`,Base URL 为 `http://:8466`(下文示例统一用 `http://localhost:8466`)。 - **业务路由挂根路径**(与参考实现一致):`/share/*`、`/chunk/*`、`/presign/*`、`/admin/*`、`/setup`。 - 仅两个公共接口带 `/api/v1` 前缀:`/api/v1/health`、`/api/v1/config`。 ## 统一响应封装 所有 JSON 接口返回统一结构,HTTP 状态码与 `code` 一致;失败时 `data` 缺省: ```json { "code": 200, "msg": "ok", "data": { } } ``` 失败示例(404): ```json { "code": 404, "msg": "文件不存在" } ``` 个别端点直接返回原始内容而非 JSON 封装(文档中已单独标注): | 端点 | 响应形式 | |---|---| | `GET /share/select?code=`(文本分享) | `text/plain; charset=utf-8` 正文 | | `GET /share/select?code=`(文件分享) | 文件二进制流(200/206,支持 Range) | | `GET /share/download?key=&code=`(文件分享) | 文件二进制流(200/206,支持 Range) | | `GET /admin/file/download?id=`(文件分享) | 文件二进制流 | | `GET /setup` / `POST /setup`(表单) | HTML 向导/成功页 | ## 字段命名约定 - 接口字段以 **snake_case** 为主(`file_code`、`size_bytes`)。 - 文件列表与审计日志的行字段同时输出 **snake_case 与 camelCase 双份**(如 `expired_at` 与 `expiredAt`),文档以 snake_case 为准,camelCase 仅为前端兼容保留。 ## 认证 - 游客接口无需认证;是否允许游客上传由配置 `openUpload` 控制(关闭时上传类接口要求管理员 `Authorization: Bearer `,否则 403)。 - 管理接口(`/admin/login` 除外)一律要求 `Authorization: Bearer `,无效/缺失返回 401。 - 详情见《认证与限流》。 ## 限流 按 IP(可信代理场景解析 `X-Forwarded-For`)维度限流,超限返回 **423**: | 规则 | 计数时机 | 默认(次/窗口) | 相关配置 | |---|---|---|---| | `upload` | **上传成功**后计数 | 10 次 / 1 分钟 | `uploadCount` / `uploadMinute` | | `error` | 取件失败(404/过期)时计数 | 10 次 / 1 分钟 | `errorCount` / `errorMinute` | | `login` | 登录失败时计数 | 5 次 / 15 分钟 | `loginCount` / `loginMinute` | | `metadata` | 每次访问即计数 | 同 `error` | `errorCount` / `errorMinute` | | `bandwidth` | 每 Read 块按 `rate` 字节/秒对齐 sleep,0=不限速 | 0 / 0(不限) | `upload_rate` / `download_rate` | ## 初始化守卫 系统未初始化(未设置管理员密码)时,除 `GET|POST /setup` 与 `GET /api/v1/health` 外, **所有接口一律返回 428**: ```json { "code": 428, "msg": "系统未初始化,请先完成初始化" } ``` 首次部署请先访问 `GET /setup` 获取 HTML 向导,或直接 `POST /setup` 完成初始化(见《管理后台 API》初始化章节)。 ## 审计 所有上传/下载端点经审计中间件自动落库(操作时间/IP/UA/设备解析/动作/结果/字节数/耗时/角色), 失败与被拒绝的请求同样记录;管理端经 `GET /admin/audit/list` 查询,详见《审计日志》。 ## 端点总览 | 模块 | 端点 | |---|---| | 公共 | `GET /api/v1/health` · `GET /api/v1/config` · `GET /robots.txt`(输出 `robotsText` 配置) | | 初始化 | `GET /setup` · `POST /setup` | | 文本分享 | `POST /share/text` | | 文件分享 | `POST /share/file` | | 查询与取件 | `GET/POST /share/metadata` · `GET /share/select` · `POST /share/select` · `GET /share/download` | | 分片上传 | `POST /chunk/upload/init` · `POST /chunk/upload/{uploadID}/{chunkIndex}` · `GET /chunk/upload/status/{uploadID}` · `POST /chunk/upload/complete/{uploadID}` · `DELETE /chunk/upload/{uploadID}` | | 预签名直传 | `POST /presign/upload/init` · `PUT /presign/upload/proxy/{uploadID}` · `POST /presign/upload/confirm/{uploadID}` · `GET /presign/upload/status/{uploadID}` · `DELETE /presign/upload/{uploadID}` | | 管理后台 | `POST /admin/login` · `GET /admin/verify` · `POST /admin/logout` · `GET /admin/dashboard` · 文件管理 `/admin/file/*` · 配置 `/admin/config/*` · 密码 `/admin/settings/password` | | 审计日志 | `GET /admin/audit/list`(别名 `/admin/audit/logs`) | ## 专题文档 | 主题 | 文档 | |---|---| | 站点 Logo 自定义 | [12-logo.md](12-logo.md) | | 错误码 | [11-errors.md](11-errors.md) | | 带宽限速(v3.2) | [13-bandwidth.md](13-bandwidth.md) | ## 时间与编码 - 时间字段一律 RFC 3339(如 `2025-06-01T12:00:00+08:00`);管理员会话过期时间为 Unix 秒。 - 请求体支持 `application/json` 与 `application/x-www-form-urlencoded`(上传类为 `multipart/form-data`),文档示例以 JSON/curl 为主。 - CORS:公开接口放开(Bearer 认证,无 Cookie CSRF 面);**管理端 `/admin/*` 已收紧**——携带 Origin 且既不同源也不在 `site_domain` 白名单时不下发 CORS 头(浏览器拦截跨域读取)。 ## 交互式文档 - 站内文档页:`/docs`(渲染本目录 markdown,构建时内嵌)。 - Swagger UI:`/openapi`(渲染 `docs/openapi.yaml`,构建时内嵌)。 - OpenAPI 规范源文件为仓库内 `docs/openapi.yaml`;如需经后端直接下载, 需在部署时把它拷贝进前端静态产物 `web/dist/`(未拷贝时该路径按 SPA 回退返回页面)。