# S3文件存储系统实现说明
## 📋 概述
本系统实现了基于S3兼容存储(MinIO)的文件上传、下载和管理功能,包括:
1. **S3配置管理**:支持多配置管理和动态切换
2. **文件上传**:支持多文件上传到S3存储
3. **文件下载**:带登录验证的文件下载
4. **文件记录**:完整的文件上传记录和关联管理
---
## 🗄️ 数据库设计
### 1. S3配置表 (`sys_s3_config`)
```sql
CREATE TABLE `sys_s3_config` (
`id` bigint NOT NULL AUTO_INCREMENT,
`endpoint` varchar(255) NOT NULL COMMENT 'S3服务端点',
`bucket` varchar(100) NOT NULL COMMENT '存储桶名称',
`access_key_id` varchar(255) NOT NULL,
`secret_access_key` varchar(255) NOT NULL,
`region` varchar(50) DEFAULT 'us-east-1',
`public_domain` varchar(255),
`enable_path_style` tinyint(1) DEFAULT 1,
`file_path` varchar(255) DEFAULT '/',
`is_active` tinyint(1) DEFAULT 1,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` tinyint(1) DEFAULT 0,
PRIMARY KEY (`id`)
);
```
### 2. 文件上传记录表 (`sys_file_upload`)
```sql
CREATE TABLE `sys_file_upload` (
`id` bigint NOT NULL AUTO_INCREMENT,
`original_name` varchar(255) NOT NULL,
`stored_name` varchar(255) NOT NULL,
`file_path` varchar(500) NOT NULL,
`file_url` varchar(500) NOT NULL,
`file_size` bigint NOT NULL,
`file_type` varchar(100),
`uploader_id` bigint NOT NULL,
`uploader_name` varchar(100),
`related_type` varchar(50),
`related_id` bigint,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` tinyint(1) DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_uploader` (`uploader_id`),
KEY `idx_related` (`related_type`, `related_id`)
);
```
---
## 🔧 后端实现
### 1. Maven依赖
在 `pom.xml` 中添加:
```xml
software.amazon.awssdk
s3
2.20.26
commons-io
commons-io
2.11.0
```
### 2. 核心服务
#### S3Service
- `uploadFile()`: 上传文件到S3
- `getFileUploadById()`: 获取文件记录
- `getFilesByRelated()`: 获取关联文件列表
#### S3ConfigService
- `getActiveConfig()`: 获取激活的配置
- `createConfig()`: 创建新配置
- `updateConfig()`: 更新配置
- `activateConfig()`: 激活指定配置
### 3. API接口
#### S3配置管理 (`/api/s3/config`)
- `GET /active` - 获取激活的配置
- `GET /list` - 获取所有配置
- `GET /{id}` - 获取指定配置
- `POST /` - 创建配置
- `PUT /{id}` - 更新配置
- `DELETE /{id}` - 删除配置
- `PUT /{id}/activate` - 激活配置
#### 文件管理 (`/api/file`)
- `POST /upload` - 上传文件(需要登录)
- 参数:`files` (MultipartFile[]), `relatedType`, `relatedId`
- 返回:文件URL列表
- `GET /download/{id}` - 下载文件(需要登录,验证token)
- 自动重定向到S3文件URL
- `GET /{id}` - 获取文件信息
- `GET /list` - 获取关联文件列表
---
## 🎨 前端实现
### 1. S3配置管理页面
在 `Settings.vue` 中添加S3配置管理标签页:
```vue
保存配置
```
### 2. 文件上传组件
在 `CreateTask.vue` 中修改文件上传逻辑:
```typescript
// 使用新的S3上传接口
const handleUpload = async (file: File) => {
const formData = new FormData();
formData.append('files', file);
formData.append('relatedType', 'task');
const response = await axios.post('/api/file/upload', formData, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'multipart/form-data'
}
});
return response.data.data; // 返回文件URL数组
};
```
### 3. 文件下载
```typescript
const downloadFile = (fileId: number) => {
const token = localStorage.getItem('token');
window.open(`/api/file/download/${fileId}`, '_blank');
// 浏览器会自动携带token(如果在请求头中)
};
```
---
## 🔐 安全特性
### 1. 登录验证
- 所有文件上传需要有效的JWT token
- 文件下载需要验证登录状态
- token验证失败返回401错误
### 2. 敏感信息保护
- API返回时自动隐藏`secretAccessKey`
- 前端更新时支持保留原密钥
### 3. 权限控制
- 只有管理员可以配置S3
- 普通用户只能上传和下载自己有权限的文件
---
## 📝 使用流程
### 1. 配置S3存储
1. 登录系统,进入**系统设置** > **S3存储配置**
2. 填写S3配置信息:
- 服务端点:`https://s3.1080p.hk`
- 存储桶:`jsxiangche`
- AccessKey和SecretKey
- 公共域名:`https://s3.1080p.hk/jsxiangche`
- 文件路径前缀:`由壹点AI/`
3. 点击保存并激活
### 2. 上传文件
1. 在创建任务页面选择文件
2. 文件自动上传到S3
3. 系统生成文件URL并保存到数据库
4. 任务中显示附件链接
### 3. 下载文件
1. 在任务卡片或详情中点击附件链接
2. 系统验证登录状态
3. 自动跳转到S3文件下载
---
## 🚀 部署步骤
### 1. 执行数据库脚本
```bash
mysql -uroot -p designhub < database/create_s3_config.sql
```
### 2. 更新后端依赖
```bash
cd backend
mvn clean install
```
### 3. 重启后端服务
```bash
systemctl restart designhub-backend
```
### 4. 更新前端
```bash
cd frontend
pnpm build
# 部署到服务器
```
---
## 🔍 测试验证
### 1. 测试S3配置
```bash
curl -X GET http://localhost:8080/api/s3/config/active \
-H "Authorization: Bearer YOUR_TOKEN"
```
### 2. 测试文件上传
```bash
curl -X POST http://localhost:8080/api/file/upload \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "files=@test.pdf" \
-F "relatedType=task" \
-F "relatedId=1"
```
### 3. 测试文件下载
```bash
curl -X GET http://localhost:8080/api/file/download/1 \
-H "Authorization: Bearer YOUR_TOKEN"
```
---
## 📌 注意事项
1. **S3配置安全**:
- AccessKey和SecretKey存储在数据库中,需要加密存储(可选)
- 管理界面只对管理员开放
2. **文件大小限制**:
- 需要在Nginx和Spring Boot中配置文件大小限制
- 建议单文件不超过100MB
3. **文件命名**:
- 使用时间戳+UUID避免文件名冲突
- 保留原始文件名用于显示
4. **错误处理**:
- S3服务不可用时给出友好提示
- 上传失败后清理临时文件
5. **性能优化**:
- 使用S3的预签名URL实现直传(可选)
- 大文件使用分片上传(可选)
---
## 🎯 后续优化建议
1. **直传优化**:前端直接上传到S3,后端只生成签名
2. **CDN加速**:配置CloudFlare等CDN加速文件访问
3. **图片处理**:集成图片压缩和格式转换
4. **文件预览**:支持PDF、图片等文件在线预览
5. **批量操作**:支持批量删除和批量下载
6. **存储统计**:显示存储空间使用情况
---
## ✅ 完成清单
- [x] 数据库表设计
- [x] 后端实体类和Mapper
- [x] S3Service核心服务
- [x] S3ConfigService配置管理
- [x] FileUploadController上传下载
- [x] S3ConfigController配置管理
- [ ] 前端S3配置管理页面
- [ ] 前端文件上传组件改造
- [ ] 系统测试和部署