客户端直传与上传签名

为什么推荐直传

如果所有文件都先经过业务服务,再转发到对象存储,业务服务仍然要承担上传带宽和连接压力——只是把「存」换成了「转发」,问题没解决。

更好的方式是客户端直传对象存储:

客户端 -> 业务服务:申请上传凭证
客户端 -> 对象存储:直传文件或分片
对象存储 -> 回调/事件:通知业务服务
业务服务 -> 数据库:更新文件状态

业务服务不再处理大流量文件内容,只处理控制面逻辑。

两种方式对比

服务端中转大流量压业务服务
浏览器业务服务对象存储
  • · 业务服务承受上传带宽与连接压力
  • · 大文件上传拖慢普通 API 与其它请求
  • · 好处是逻辑集中、好调试、易加自定义校验
客户端直传业务服务只走控制面
浏览器│① 申请签名 ──▶ 业务服务(鉴权 / 配额)│② 返回短期签名 ◀──│浏览器 对象存储(带签名直传)│③ 上传完成回调 / 客户端提交完成
  • · 文件内容不进业务服务,只处理鉴权与元数据
  • · 签名短期有效、限定对象 key 与大小
  • · 配合回调 / 事件确认上传结果

上传签名怎么做

直传的关键是签名。业务服务签发一个短期有效的上传凭证,对象存储只认这个签名:

签名里通常包含:

  • 允许写入的对象 key 前缀(限定路径,防止写错位置)。
  • 过期时间(如 15 分钟,过期失效)。
  • 大小上限、内容类型等约束。
  • 签名本身的 HMAC 校验值。

这样业务服务不用每字节都经过,但每个字节的「允许写入」都由它控制。

直传的时序

客户端直传对象存储

客户端发起上传
1 · 动作

申请上传凭证

业务服务校验权限、配额,生成短期签名
2 · 动作

客户端带签名直传对象存储

文件内容不经过业务服务
3 · 动作

上传完成回调 / 客户端提交完成

对象存储事件或客户端主动通知
4 · 判断

业务服务校验并更新状态

比对对象信息,元数据流转到 scanning
5 · 结果

文件进入后续流程

合并 / 扫描 / 可用
大流量留在数据面,控制面只做判断

直传的安全要点

  • 签名短期有效,防止被拿去写任意位置。
  • 对象 key 白名单前缀,防止绕过业务规则。
  • 上传完成后由服务端确认(回调或主动查询),不能只信客户端。
  • 回调接口要防伪造(校验签名 / 来源)。

小结

客户端直传是「控制面 / 数据面分层」的落地:业务服务发「入场券」,对象存储管「仓库」,两边用签名和回调衔接。下一节看对象 key 怎么设计、元数据一致性怎么保证。

发现内容有问题?

告诉我们哪里需要改进。