# 管理端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*