# 管理端OSS文件上传功能

## 📋 功能概述

基于用户端OSS上传接口 `/user/oss/post-signature` 实现的管理端文件上传功能，提供了更强大的文件管理能力，同时**与用户端文件存储在同一目录下**，便于统一管理。

## ✅ 已实现功能

### 核心接口
- ✅ `POST /admin/oss/post-signature` - 生成OSS POST签名
- ✅ `DELETE /admin/oss/file` - 删除单个文件
- ✅ `POST /admin/oss/batch-delete` - 批量删除文件
- ✅ `GET /admin/oss/file-info` - 获取文件信息
- ✅ `GET /admin/oss/upload-config` - 获取上传配置

### 技术实现
- ✅ **DTO类设计**: AdminOssUploadRequest、AdminOssUploadResponse
- ✅ **服务层**: AdminOssService接口 + AdminOssServiceImpl实现
- ✅ **控制器**: AdminOssController，包含完整的CRUD操作
- ✅ **权限验证**: 使用@RequireAdminOrStaff注解，确保只有管理员可访问
- ✅ **统一目录**: 与用户端共享`user_img/`目录

### 功能特性
- ✅ **更大文件**: 支持最大500MB文件上传（用户端10MB）
- ✅ **更多格式**: 支持图片、文档、音视频、压缩包等全格式
- ✅ **更长有效期**: 2小时有效期（用户端1小时）
- ✅ **完整管理**: 支持文件删除、批量删除、信息查询
- ✅ **灵活配置**: 支持自定义子目录、文件大小限制
- ✅ **操作记录**: 完整的操作日志记录

## 📁 目录结构

```
项目根目录/
├── src/main/java/com/dora/
│   ├── dto/
│   │   ├── AdminOssUploadRequest.java     # 管理端上传请求DTO
│   │   └── AdminOssUploadResponse.java    # 管理端上传响应DTO
│   ├── service/
│   │   ├── AdminOssService.java           # 管理端OSS服务接口
│   │   └── impl/
│   │       └── AdminOssServiceImpl.java   # 管理端OSS服务实现
│   └── controller/
│       └── AdminOssController.java        # 管理端OSS控制器
├── docs/
│   ├── admin-oss-upload-api.md           # 完整API文档
│   ├── admin-oss-upload-examples.md      # 使用示例
│   └── admin-oss-upload-readme.md        # 本文件
└── ...
```

## 🔗 存储路径

### 统一存储规则
- **基础目录**: `user_img/` (配置在OssConfig.userImgFolder)
- **用户端文件**: `user_img/{用户上传的文件}`
- **管理端文件**: `user_img/{指定子目录}/{管理端上传的文件}`

### 推荐子目录
```
user_img/
├── banners/          # Banner图片 (管理端)
├── images/           # 通用图片 (管理端)
├── documents/        # 文档文件 (管理端)
├── videos/           # 视频文件 (管理端)
├── audios/           # 音频文件 (管理端)
├── uploads/          # 默认目录 (管理端)
└── {用户文件}         # 用户端直接上传的文件
```

## 🚀 快速使用

### 1. 获取管理员Token
```bash
curl -X POST "https://your-api.com/admin/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"password"}'
```

### 2. 生成上传签名
```bash
curl -X POST "https://your-api.com/admin/oss/post-signature" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "fileName": "banner.jpg",
    "directory": "banners",
    "maxSizeMB": 50
  }'
```

### 3. 上传文件到OSS
```bash
# 使用返回的签名信息上传到OSS
curl -X POST "{返回的host}" \
  -F "key={返回的dir}文件名" \
  -F "policy={返回的policy}" \
  -F "OSSAccessKeyId={返回的accessKeyId}" \
  -F "x-oss-signature-version={返回的version}" \
  -F "x-oss-credential={返回的x_oss_credential}" \
  -F "x-oss-date={返回的x_oss_date}" \
  -F "signature={返回的signature}" \
  -F "success_action_status=200" \
  -F "file=@/path/to/your/file.jpg"
```

## 📊 功能对比

| 特性 | 用户端接口 | 管理端接口 | 说明 |
|------|-----------|-----------|------|
| **接口路径** | `/user/oss/post-signature` | `/admin/oss/post-signature` | 路径不同 |
| **权限验证** | 无需认证 | 需要管理员Token | 安全级别不同 |
| **文件大小** | 最大10MB | 最大500MB | 管理端支持更大文件 |
| **文件格式** | 基础格式 | 全格式支持 | 管理端支持更多格式 |
| **有效期** | 1小时 | 2小时 | 管理端有效期更长 |
| **存储目录** | `user_img/` | `user_img/{subdir}/` | 同一根目录 |
| **管理功能** | 仅上传 | 完整CRUD | 管理端功能更全 |

## 🔧 配置说明

### OSS配置
```yaml
# application.yml
aliyun:
  oss:
    endpoint: https://oss-cn-hangzhou.aliyuncs.com
    bucket-name: oss-1818ai-user-img
    region: cn-hangzhou
    user-img-folder: user_img/              # 统一存储目录
    expiration-seconds: 3600
    access-key-id: ${ALIYUN_OSS_ACCESS_KEY_ID}
    access-key-secret: ${ALIYUN_OSS_ACCESS_KEY_SECRET}
```

### 支持的文件格式
```java
// 图片格式
.jpg, .jpeg, .png, .gif, .bmp, .webp, .svg, .ico, .tiff

// 文档格式
.pdf, .txt, .md, .json, .xml, .csv, .doc, .docx, .xls, .xlsx, .ppt, .pptx

// 压缩包格式
.zip, .rar, .7z, .tar, .gz, .bz2, .xz

// 音频格式
.mp3, .wav, .flac, .aac, .ogg, .wma

// 视频格式
.mp4, .avi, .mov, .wmv, .flv, .mkv, .webm

// 其他格式
.html, .css, .js, .sql, .log
```

## 🛡️ 安全特性

### 权限控制
- **接口级别**: `@RequireAdminOrStaff` 注解确保只有管理员/工作人员可访问
- **AspectJ切面**: 自动验证JWT Token有效性和用户权限
- **身份记录**: 自动记录操作者的管理员ID

### 文件安全
- **类型白名单**: 严格的文件类型验证，防止恶意文件上传
- **大小限制**: 可配置的文件大小限制，防止过大文件占用存储
- **目录隔离**: 支持子目录分类，便于文件管理
- **操作审计**: 完整的操作日志，支持追溯

## 📖 使用文档

- 📚 [完整API文档](./admin-oss-upload-api.md) - 详细的接口文档和参数说明
- 💻 [使用示例](./admin-oss-upload-examples.md) - JavaScript/Vue/React等框架的使用示例
- 🔧 [错误排查指南](#错误排查) - 常见问题和解决方案

## 🚨 注意事项

### 重要提醒
1. **目录统一**: 管理端和用户端文件存储在同一根目录 `user_img/` 下
2. **权限必需**: 所有管理端接口都需要有效的管理员JWT Token
3. **文件命名**: 建议使用时间戳+随机数避免文件名冲突
4. **大小限制**: 注意文件大小限制，避免上传失败
5. **网络超时**: 大文件上传注意设置合适的超时时间

### 最佳实践
1. **错误处理**: 做好网络异常和服务器错误的异常处理
2. **进度显示**: 大文件上传时显示进度，提升用户体验
3. **重试机制**: 对于网络不稳定情况，实现上传重试
4. **文件校验**: 上传完成后可进行文件完整性校验
5. **清理机制**: 定期清理失效或无用的文件

## 🔍 错误排查

### 常见错误及解决方案

| 错误代码 | 错误信息 | 可能原因 | 解决方案 |
|---------|---------|---------|---------|
| 401 | 未授权访问 | JWT Token无效或过期 | 重新登录获取新Token |
| 403 | 权限不足 | 不是管理员或工作人员 | 确认账号权限 |
| 400 | 不支持的文件类型 | 文件格式不在白名单中 | 检查文件格式是否支持 |
| 400 | 文件大小超限 | 文件超过大小限制 | 压缩文件或选择更小的文件 |
| 500 | OSS签名生成失败 | OSS配置错误 | 检查OSS配置参数 |

### 调试技巧
```javascript
// 开启调试模式
localStorage.setItem('debug', 'true');

// 查看详细错误信息
console.log('Upload error details:', error);

// 测试Token有效性
fetch('/admin/oss/upload-config', {
  headers: { 'Authorization': `Bearer ${token}` }
})
.then(r => r.json())
.then(result => console.log('Token test:', result));
```

## 🔄 版本历史

### v1.0.0 (2024-12-25)
- ✅ 实现基础的管理端OSS上传功能
- ✅ 支持与用户端统一目录存储
- ✅ 完整的文件管理CRUD操作
- ✅ 权限验证和安全控制
- ✅ 支持多种文件格式和大文件上传

## 🤝 技术支持

如果在使用过程中遇到问题，请按以下步骤排查：

1. **检查Token**: 确认管理员JWT Token有效
2. **验证权限**: 确认当前用户有管理员/工作人员权限
3. **文件格式**: 确认文件格式在支持列表中
4. **大小限制**: 确认文件大小在限制范围内
5. **网络连接**: 确认网络连接正常
6. **OSS配置**: 确认OSS相关配置正确

---

*最后更新: 2024-12-25*  
*版本: v1.0.0*
