Nebula Storage 业务功能
1. 功能概览
从当前代码和 README 可以确认,nebula-storage 对业务系统提供的能力主要包括六类:
- 上传任务管理
- 普通文件上传
- 分片上传
- 正式文件绑定与查询
- 登录态文件下载
- 分享链接下载与文件删除
这些能力围绕“附件生命周期”展开,而不是孤立的上传/下载接口。
2. 上传任务管理
2.1 创建上传任务
适用场景:
- 大文件分片上传
- 前端需要先申请一个任务 ID,再逐步上传分片
- 需要在上传前声明文件名、文件大小、分片数等元信息
业务价值:
- 给上传过程一个稳定主键
- 让分片上传具备可追踪状态
- 便于断点续传、排障与审计
2.2 查询上传任务详情
适用场景:
- 前端上传过程中轮询任务状态
- 业务排查上传卡在哪一步
- 页面刷新后恢复上传进度显示
当前任务详情里可以拿到:
- 上传模式
- 文件大小与 hash
- 分片总数和已上传分片数
- 当前状态
- 最后分片时间
- 是否已生成正式文件 ID
3. 普通文件上传
3.1 直接上传并生成临时任务
适用场景:
- 常规附件上传
- 页面里直接选一个文件上传
- 文件不大,不需要分片
当前模块提供的普通上传入口是:
- 直接上传:由系统自动生成临时任务
3.2 业务含义
普通上传完成后,文件已经进入系统临时区,但此时仍然不是正式业务文件。
也就是说:
- 可以看见上传任务详情
- 还不能把它当成长期业务附件
- 仍需要业务在自己的保存流程成功后调用 bind 转正
这样做特别适合以下业务:
- 表单先传附件,再点“保存”
- 保存失败时不希望立即产生正式附件记录
- 多个附件先上传,再统一绑定到单据
4. 分片上传
4.1 分片写入
适用场景:
- 大文件上传
- 网络不稳定
- 需要断点续传
- 前端按块并发/串行发送内容
当前模块支持:
- 按
taskId + partNo写入分片 - 使用
partHash进行分片一致性校验;如果调用方传入partHash,服务端会在本次上传时校验它必须与实际内容一致 - 对已存在分片进行幂等处理
4.2 完成上传任务
所有分片都上传完成后,需要调用 complete:
- 校验分片数量是否齐全
- 合并分片
- 生成临时完整文件
- 计算完整文件 hash
- 把任务标记为完成
4.3 业务价值
分片上传解决的是“上传链路稳定性”,而不是“正式业务入库”。
它特别适合:
- 视频、压缩包、批量导入文件
- 浏览器长传输时间场景
- 内网质量不稳定的办公环境
5. 绑定转正
5.1 功能定位
bind 是 storage 模块里最关键的业务动作。
它的作用是:
- 将已完成的上传任务绑定到某个业务实体
- 生成正式文件记录
storage_file - 补齐文件归属信息
- 让文件进入长期可查询、可下载状态
5.2 当前绑定字段
当前绑定时要求业务方提供:
sourceEntitysourceIdsourceType(可选,默认default)
这三个字段的业务含义可以理解为:
sourceEntity:文件属于哪个业务对象类型,例如contract、notice、invoicesourceId:具体是哪条业务记录sourceType:进一步区分来源类型、分组或上下文
5.3 业务价值
bind 把“文件内容”变成“业务附件”。
因此它适合放在:
- 单据保存成功之后
- 公告创建成功之后
- 业务流程真正落库之后
而不建议在“文件刚上传完、业务还没成功”时就直接视为正式附件。
6. 正式文件查询
6.1 文件详情
适用场景:
- 回显附件详情
- 查询文件基本元数据
- 下载前先取信息
当前可查询内容包括:
- 文件名、扩展名、MIME 类型
- 文件大小
- 文件 hash
- 业务归属信息
- 上传任务 ID
- 上传用户 ID
- 创建更新时间
6.2 文件分页
适用场景:
- 附件列表页
- 业务实体关联附件分页查看
- 按上传人或来源实体查询文件
当前分页查询支持按以下条件过滤:
fileNamesourceEntitysourceIdsourceTypeuploadUserId
这足以支撑大多数后台附件管理页面。
7. 登录态下载
7.1 功能定位
这是给“系统内部用户自己下载文件”使用的标准入口。
典型场景:
- 管理后台点击附件下载
- 业务页面预览/下载附件
- 已登录用户访问系统内附件
7.2 特点
- 依赖登录态
- 会触发
StoragePermissionChecker权限校验 - 可以自定义下载时展示的文件名
- 返回真实文件流
7.3 适用建议
只要是平台用户自己下载,优先使用登录态下载,不建议为了内部下载而滥用签名下载。
8. 分享链接下载
8.1 功能定位
签名下载解决的不是“前端自己怎么下载”,而是:
一个已登录用户,想生成一个临时可分享链接,给别人下载。
8.2 当前能力
模块当前支持:
- 生成签名下载地址
- 指定或默认下载文件名
- 指定有效期
- 指定最大下载次数
- 第三方无登录态下载
8.3 适用场景
例如:
- 把合同文件发给外部合作方
- 把压缩包分享给未登录用户
- 给客户生成一个短时附件下载地址
8.4 使用边界
签名下载适合“分享”,不适合作为平台内部下载主链路。
原因是:
- 链接有时效
- 链接一旦泄露就不再依赖平台登录态
- 更适合短时外部流转而不是长期内部访问
9. 文件删除
9.1 功能定位
删除正式文件会删除 storage_file 业务记录。
但模块并不会无脑删底层内容,而是会检查:
- 是否还有其他正式文件记录引用同一个物理文件位置
只有没有其他引用时,才会删除真实内容。
9.2 业务价值
这对“内容复用”场景非常重要。
例如:
- 同一个文件被多个业务实体引用
- 同一个文件重复上传后复用了已有
storageKey
这种情况下删掉其中一个业务引用,不应该导致其他业务记录失效。
10. provider 相关业务能力
虽然 provider 是技术实现,但对业务能力有直接影响。
10.1 filesystem
适合:
- 本地开发
- 单机测试
- 小规模部署
10.2 db
适合:
- 不想额外接对象存储
- 文件规模相对可控
- 希望所有数据统一落数据库
10.3 minio
适合:
- 生产环境
- 多节点部署
- 附件规模较大
- 需要对象存储能力
从业务角度看,这三种 provider 不影响上层接口契约,切换成本主要在配置层。
11. 典型业务流程建议
11.1 表单附件上传
适合:
- 公告、合同、工单、审批单附件
推荐流程:
- 前端直接上传普通文件
- 拿到临时上传任务详情
- 业务表单提交成功
- 后端调用 bind,把任务和业务记录关联
- 返回正式文件 ID
11.2 大文件上传
适合:
- 视频
- 导入包
- 归档文件
推荐流程:
- 创建上传任务
- 分片上传
- 调用 complete
- 业务保存成功后 bind
- 后续使用正式文件 ID 查询与下载
11.3 平台内下载
适合:
- 后台用户自己下载
推荐流程:
- 查文件 ID
- 调用
/api/storage/download - 按业务权限校验后下载
11.4 对外分享下载
适合:
- 分享给外部人员
推荐流程:
- 已登录用户申请签名下载链接
- 平台返回短时分享 URL
- 将 URL 发给第三方
- 第三方使用
download-signed下载
12. 小结
从业务视角看,Nebula Storage 的真正价值不只是“上传文件”,而是提供了:
- 一个可绑定业务归属的附件生命周期模型
- 一个支持普通文件和大文件的统一上传体系
- 一个支持内部下载与外部分享下载的双通道模型
- 一个支持多存储 provider 的底层能力抽象
如果你的业务里涉及“附件先上传,再保存单据,再长期管理,再下载或分享”,那么 storage 模块已经基本覆盖了这条完整链路。