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

291 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 文件上传接口文档
## 目录
- [接口概览](#接口概览)
- [通用说明](#通用说明)
- [上传接口(内部)](#上传接口内部)
- [文件管理接口](#文件管理接口)
- [内外部调用规则](#内外部调用规则)
- [错误码](#错误码)
---
## 接口概览
| 类别 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 上传 | `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` | 文件大小超出限制 |