设计思路
设计要点
多存储后端支持
通过策略模式实现多存储后端支持:
- FileService 接口 - 定义统一的文件操作接口,包含上传、签名、删除等操作
- OssSpEnum 枚举 - 定义支持的存储服务商(阿里云 OSS、AWS S3、MinIO)
- 动态服务选择 - 运行时根据 Bucket 配置动态选择对应的服务实现
这种设计的好处是:
- 业务代码无需关心底层存储细节
- 切换存储服务商只需修改配置,无需改动代码
- 易于扩展新的存储后端
Bucket 缓存机制
采用本地缓存 + Redis 分布式通知实现配置热更新:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 管理后台 │────▶│ Redis │◀────│ 服务实例 A │
│ (修改配置) │ │ (通知通道) │ │ (本地缓存) │
└─────────────┘ └─────────────┘ └─────────────┘
│
│ 12秒检查
▼
┌─────────────┐
│ 服务实例 B │
│ (本地缓存) │
└─────────────┘- 本地缓存:减少数据库查询,提高性能
- Redis 通知:配置变更时通知所有实例刷新
- 定时检查:每 12 秒检查一次配置变更
文件访问安全
私有读(默认)
- 文件上传后默认为私有访问
- 需要通过签名 URL 才能访问
- 支持自定义过期时间(默认 10 分钟)
公有读(慎用)
- 上传时指定为公有文件
- 无需签名即可直接访问
- 适用于公开资源,如网站 Logo
签名机制
- 使用存储服务商的预签名 URL 机制
- 支持单文件、批量文件签名
- 支持富文本内容中的文件 URL 自动签名
文件类型限制
通过配置限制上传文件的大小和类型:
- 图片限制:可配置最大大小(默认 2MB)和允许的格式
- 视频限制:可配置最大大小(默认 100MB)和允许的格式
- 扩展名检查:上传时自动检查文件扩展名是否在允许列表中
文件存储路径规则
文件在存储后端中的路径格式:
{business_type}/{date}/{uuid}.{ext}
示例:
user_avatar/20240115/a1b2c3d4.jpg
order_attach/20240115/e5f6g7h8.pdf
public/logo/20240115/i9j0k1l2.png- business_type:业务类型,用于分类管理
- date:上传日期,便于按时间归档
- uuid:随机生成的唯一标识
- ext:原始文件扩展名
公有文件会在路径前添加 public/ 前缀。