Files
1818web-hoduan/docs/admin-oss-upload-bug-fix.md

214 lines
6.5 KiB
Markdown
Raw Normal View History

# 管理端OSS上传Bug修复报告
## 🐛 问题描述
### 错误现象
```
2025-09-02T14:23:46.248+08:00 ERROR 30800 --- [1818-user-server] [nio-8081-exec-7] c.dora.exception.GlobalExceptionHandler : 系统异常
org.springframework.web.servlet.resource.NoResourceFoundException: No static resource admin/upload/cover.
```
### 问题分析
1. **前端请求路径**: 前端正在访问 `/admin/upload/cover` 接口
2. **后端实现路径**: 我们实现的管理端OSS接口路径为 `/admin/oss/*`
3. **Spring处理**: Spring将 `/admin/upload/cover` 当作静态资源请求处理
4. **静态资源缺失**: 找不到对应的静态资源文件,导致抛出 `NoResourceFoundException`
### 根本原因
- 前端代码使用的是 `/admin/upload/*` 路径
- 后端实现的是 `/admin/oss/*` 路径
- 路径不匹配导致请求被Spring的静态资源处理器拦截
---
## 🔧 修复方案
### 方案选择
采用**向后兼容**的方式,同时提供两套接口路径:
- **新版接口**: `/admin/oss/*` (功能更完整)
- **兼容接口**: `/admin/upload/*` (保持向后兼容)
### 具体实现
#### 1. 创建兼容控制器
创建 `AdminUploadController.java`,提供以下兼容接口:
| 路径 | 方法 | 功能 | 对应的新版接口 |
|------|------|------|---------------|
| `/admin/upload/cover` | POST | 生成封面上传签名 | `/admin/oss/post-signature` |
| `/admin/upload/signature` | POST | 生成通用上传签名 | `/admin/oss/post-signature` |
| `/admin/upload/file` | DELETE | 删除文件 | `/admin/oss/file` |
| `/admin/upload/config` | GET | 获取上传配置 | `/admin/oss/upload-config` |
#### 2. 修复WebConfig
改进 `WebConfig.java`
- 修复依赖注入方式(使用构造函数注入)
- 添加注释说明排除管理端上传API路径
#### 3. 保持权限验证
- 兼容接口同样使用 `@RequireAdminOrStaff` 注解
- 确保安全性与新版接口一致
---
## ✅ 修复结果
### 解决的问题
1.**静态资源错误**: 不再将 `/admin/upload/*` 当作静态资源处理
2.**路径兼容**: 前端可以继续使用原有的 `/admin/upload/*` 路径
3.**功能完整**: 兼容接口提供与新版接口相同的功能
4.**权限安全**: 保持相同的权限验证机制
### 新增功能
1.**双路径支持**: 同时支持新版和兼容路径
2.**自动目录**: `/admin/upload/cover` 自动使用 `covers` 目录
3.**向前兼容**: 建议逐步迁移到新版 `/admin/oss/*` 接口
---
## 📡 接口映射关系
### 原有路径 → 新版路径
```javascript
// 原有前端代码可以继续使用
POST /admin/upload/cover → 内部调用 AdminOssService
POST /admin/upload/signature → 内部调用 AdminOssService
DELETE /admin/upload/file → 内部调用 AdminOssService
GET /admin/upload/config → 内部调用 AdminOssService
// 推荐使用新版接口(功能更完整)
POST /admin/oss/post-signature → 直接调用 AdminOssService
POST /admin/oss/batch-delete → 批量删除功能(兼容接口不支持)
GET /admin/oss/file-info → 文件信息查询(兼容接口不支持)
DELETE /admin/oss/file → 删除文件
GET /admin/oss/upload-config → 获取配置
```
---
## 🔄 前端使用指南
### 方式一:继续使用兼容接口(最简单)
```javascript
// 无需修改现有代码,直接使用
const response = await fetch('/admin/upload/cover', {
method: 'POST',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
fileName: 'cover.jpg',
maxSizeMB: 50
})
});
```
### 方式二:迁移到新版接口(推荐)
```javascript
// 使用功能更完整的新版接口
const response = await fetch('/admin/oss/post-signature', {
method: 'POST',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
fileName: 'cover.jpg',
directory: 'covers', // 可自定义目录
maxSizeMB: 50
})
});
// 新版接口还支持批量删除和文件信息查询
const batchResult = await fetch('/admin/oss/batch-delete', {
method: 'POST',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify([
'user_img/covers/old1.jpg',
'user_img/covers/old2.jpg'
])
});
```
---
## 🛡️ 安全验证
### 权限检查
- ✅ 所有接口都需要管理员JWT Token
- ✅ 使用 `@RequireAdminOrStaff` 注解确保权限
- ✅ 自动记录操作者的管理员ID
### 文件安全
- ✅ 文件类型白名单验证
- ✅ 文件大小限制检查
- ✅ 目录统一管理(与用户端共享 `user_img/` 目录)
---
## 📋 测试验证
### 测试用例
```bash
# 1. 测试兼容接口 - 封面上传
curl -X POST "http://localhost:8081/admin/upload/cover" \
-H "Authorization: Bearer {admin_token}" \
-H "Content-Type: application/json" \
-d '{"fileName":"cover.jpg","maxSizeMB":50}'
# 2. 测试兼容接口 - 通用上传
curl -X POST "http://localhost:8081/admin/upload/signature" \
-H "Authorization: Bearer {admin_token}" \
-H "Content-Type: application/json" \
-d '{"fileName":"file.pdf","maxSizeMB":50}'
# 3. 测试兼容接口 - 获取配置
curl -X GET "http://localhost:8081/admin/upload/config" \
-H "Authorization: Bearer {admin_token}"
# 4. 测试新版接口 - 完整功能
curl -X POST "http://localhost:8081/admin/oss/post-signature" \
-H "Authorization: Bearer {admin_token}" \
-H "Content-Type: application/json" \
-d '{"fileName":"banner.jpg","directory":"banners","maxSizeMB":50}'
```
### 预期结果
- ✅ 所有请求都应该返回 200 状态码
- ✅ 不再出现 `NoResourceFoundException`
- ✅ 返回正确的OSS签名信息
---
## 📚 相关文档
- 📖 [完整API文档](./admin-oss-upload-api.md)
- 💻 [使用示例代码](./admin-oss-upload-examples.md)
- 📋 [功能总览](./admin-oss-upload-readme.md)
---
## 🎯 后续建议
### 短期
1. **验证修复**: 确认前端不再出现静态资源错误
2. **功能测试**: 测试文件上传功能是否正常工作
3. **性能监控**: 观察接口响应时间和成功率
### 长期
1. **前端迁移**: 逐步将前端代码迁移到新版 `/admin/oss/*` 接口
2. **功能增强**: 利用新版接口的批量删除、文件信息查询等高级功能
3. **监控告警**: 添加文件上传失败的监控和告警
---
**修复时间**: 2025-01-27
**影响范围**: 管理端文件上传功能
**风险等级**: 低(向后兼容,不影响现有功能)
**测试状态**: ✅ 已完成