Skip to content

设计思路

设计要点

多存储后端支持

通过策略模式实现多存储后端支持:

  1. FileService 接口 - 定义统一的文件操作接口,包含上传、签名、删除等操作
  2. OssSpEnum 枚举 - 定义支持的存储服务商(阿里云 OSS、AWS S3、MinIO)
  3. 动态服务选择 - 运行时根据 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/ 前缀。

Released under the MIT License.