safety-eval-service/docs/文件上传接口文档.md

291 lines
8.0 KiB
Markdown
Raw Normal View History

2026-07-01 17:13:41 +08:00
# 文件上传接口文档
## 目录
- [接口概览](#接口概览)
- [通用说明](#通用说明)
- [上传接口(内部)](#上传接口内部)
- [文件管理接口](#文件管理接口)
- [内外部调用规则](#内外部调用规则)
- [错误码](#错误码)
---
## 接口概览
| 类别 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 上传 | `POST` | `/file/upload` | 内部单个上传 |
| 上传 | `POST` | `/file/upload/batch` | 内部批量上传 |
| 管理 | `GET` | `/file-storage/presigned-url/{fileId}` | 获取签名 URL |
| 管理 | `GET` | `/file-storage/info/{fileId}` | 获取文件信息 |
| 管理 | `GET` | `/file-storage/download/{fileId}` | 下载文件 |
| 管理 | `GET` | `/file-storage/list-all` | 全部文件列表 |
| 管理 | `GET` | `/file-storage/list-by-creator` | 按上传者查询 |
| 管理 | `DELETE` | `/file-storage/delete/{fileId}` | 删除文件 |
| 管理 | `DELETE` | `/file-storage/delete-batch` | 批量删除 |
---
## 通用说明
### 基础路径
```
开发环境: http://localhost:{port}
生产环境: 按实际部署域名
```
### 统一响应体
```json
{
"success": true,
"code": "0",
"message": "ok",
"data": { ... }
}
```
### 文件上传大小限制
| 限制项 | 值 |
|--------|-----|
| 单文件上限 | **100 MB** |
| 单次请求上限 | **500 MB** |
### 支持文件类型
不限制文件类型,支持文本、图片、音频、视频等所有常见格式。
---
## 上传接口(内部)
> **所有上传接口均为内部接口**需要携带有效登录凭证Cookie / Token
> 上传完成后自动将文件元信息写入 `filestorage` 表。
---
### 1. 内部单个上传
```
POST /file/upload
```
**请求**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `file` | MultipartFile (form-data) | 是 | 上传的文件 |
**示例**
```bash
curl -X POST "http://localhost:8080/file/upload" \
-H "Cookie: ..." \
-F "file=@/path/to/document.pdf"
```
**成功响应**
```json
{
"success": true,
"code": "0",
"message": "ok",
"data": {
"id": 1001,
"url": "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/xxx.pdf",
"presignedUrl": null,
"size": 204800,
"originalFilename": "document.pdf",
"ext": "pdf",
"contentType": "application/pdf",
"creatorName": "张三",
"createdTime": "2026-06-30T10:30:00"
}
}
```
| 响应字段 | 类型 | 说明 |
|----------|------|------|
| `id` | Integer | 文件记录主键,后续管理操作依赖此 ID |
| `url` | String | OSS 文件永久访问路径 |
| `presignedUrl` | String | 上传时返回 `null`,需通过签名 URL 接口获取 |
| `size` | Long | 文件大小(字节) |
| `originalFilename` | String | 上传时的原始文件名 |
| `ext` | String | 文件扩展名 |
| `contentType` | String | MIME 类型 |
| `creatorName` | String | 创建人姓名(当前登录用户) |
| `createdTime` | String | 文件创建时间 |
---
### 2. 内部批量上传
```
POST /file/upload/batch
```
**请求**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `files` | List\<MultipartFile\> (form-data) | 是 | 多个上传文件(同名参数) |
**示例**
```bash
curl -X POST "http://localhost:8080/file/upload/batch" \
-H "Cookie: ..." \
-F "files=@/path/to/file1.png" \
-F "files=@/path/to/file2.png" \
-F "files=@/path/to/file3.png"
```
**成功响应**
```json
{
"success": true,
"code": "0",
"message": "ok",
"data": [
{ "id": 1001, "url": "...", "size": 204800, "originalFilename": "file1.png", ... },
{ "id": 1002, "url": "...", "size": 307200, "originalFilename": "file2.png", ... }
]
}
```
> **部分成功策略**:批量上传时,若某个文件上传失败,该文件被跳过,不影响其余文件的上传。
---
## 文件管理接口
### 3. 获取签名 URL
```
GET /file-storage/presigned-url/{fileId}
```
返回带 1 小时有效期的临时访问链接,用于文件预览或安全分发。
**成功响应**
```json
{
"success": true,
"data": {
"id": 1001,
"url": "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/xxx.pdf",
"presignedUrl": "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/xxx.pdf?Expires=...&OSSAccessKeyId=...&Signature=...",
"size": 204800,
"originalFilename": "document.pdf",
"contentType": "application/pdf",
"creatorName": "张三",
"createdTime": "2026-06-30T10:30:00"
}
}
```
### 4. 获取文件信息
```
GET /file-storage/info/{fileId}
```
仅返回文件元信息,不主动生成签名 URL。
### 5. 下载文件
```
GET /file-storage/download/{fileId}
```
以附件形式流式下载文件,`Content-Disposition: attachment`。
### 6. 删除文件
```
DELETE /file-storage/delete/{fileId}
```
同时删除 OSS 文件与 `filestorage` 表记录,不可恢复。
### 7. 批量删除
```
DELETE /file-storage/delete-batch
Content-Type: application/json
[1001, 1002, 1003]
```
### 8. 列表查询
| 接口 | 说明 |
|------|------|
| `GET /file-storage/list-all` | 查询所有文件记录 |
| `GET /file-storage/list-by-creator?creatorUid=xxx` | 按上传者 UID 查询 |
---
## 内外部调用规则
### 核心原则
| 维度 | 说明 |
|------|------|
| **上传写入** | 必须通过上传接口,由接口自动同步到 `filestorage` 表 |
| **表管理** | `filestorage` 表仅提供读取和删除,不允许直接通过 API 新增/修改记录 |
| **安全性** | 文件不直接暴露 OSS 原始 URL前端通过签名 URL 获取临时访问权限 |
### 调用流程图
```
┌─────────────┐ POST /file/upload ┌─────────────┐
│ 前端 / │ ──────────────────────────▶ │ API 层 │
│ 调用方 │ │ │
└─────────────┘ └──────┬──────┘
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 上传 OSS │ │ 写表同步 │ │ 获取 ID │
│(x-file- │ │filestorage│ │ 返回前端 │
│ storage) │ │ 表记录 │ │ │
└──────────┘ └──────────┘ └──────────┘
```
### 创建人区分(扩展预留)
当前所有上传接口均为**内部接口**,创建人取自当前登录用户。扩展场景说明:
| 场景 | 接口路径 | 创建人 | 适用情况 |
|------|----------|--------|----------|
| 内部用户上传 | `/file/upload` | 当前登录用户 | 业务操作中上传附件、素材等 |
| > 公开/匿名通道 | `/file/upload/public` | system | 未登录用户提交(可在需要时暴露) |
### 使用规范
1. **禁止绕过上传接口直接操作表**`filestorage` 表的新增只能由上传接口内部完成,外部系统不允许直接 INSERT
2. **文件访问走签名 URL**`presignedUrl` 有效期 1 小时,到期后需重新获取
3. **删除不可逆**:删除操作同时清理 OSS 和 DB调用前需做二次确认
---
## 错误码
| 错误码 | 说明 |
|--------|------|
| `03-01-001` | 文件上传失败 |
| `03-01-002` | 上传文件为空 |
| `03-01-003` | 文件不存在 |
| `03-01-004` | 文件删除失败 |
| `03-01-005` | 文件下载失败 |
| `03-01-006` | OSS 操作异常 |
| `03-01-007` | 文件地址生成失败 |
| `03-01-008` | 文件大小超出限制 |