在Web应用开发中,文件上传是一个极其常见的需求。随着云服务的普及,将文件直接存储到云存储服务(如阿里云OSS、腾讯云COS、AWS S3等)已成为标准做法。然而,一个关键的架构问题随之而来:文件上传的路径,究竟应该让前端直接与OSS交互,还是统一经由后端服务器转发?
这个问题没有唯一的正确答案,但有一个在当前环境下被广泛认为是最佳的实践。让我们深入分析一下两种模式的优劣。
在这种模式下,前端应用直接从OSS服务提供商获取一个临时上传凭证,然后使用这个凭证将文件直接上传到OSS,上传成功后,将文件的最终地址告诉后端服务器。
流程大致如下:
这是传统的方式,前端将文件通过multipart/form-data形式提交给自己的后端服务器,再由后端服务器使用永久秘钥将文件转发到OSS。
流程大致如下:
在分析前端直传的劣势时,我们提到了安全风险。而STS(Security Token Service) 正是解决这个问题的钥匙。
STS是云厂商提供的一种颁发临时访问凭证的服务。这些临时凭证具备以下特点:
通过STS,我们既享受了前端直传的性能优势,又极大地规避了安全风险。这使得“前端直传+STS”的组合成为了事实上的最佳实践。
综合以上分析,我们推荐采用一种混合架构,它集两种模式之长,避两者之短。
架构流程图:
sequenceDiagram
participant U as 前端用户
participant S as 后端服务器
participant STS as 云STS服务
participant O as 对象存储(OSS)
U->>S: 1. 请求上传凭证
Note right of S: 校验用户权限、<br>定义上传策略
S->>STS: 2. 申请临时Token
STS-->>S: 3. 返回临时Token
S-->>U: 4. 返回临时Token和上传配置
U->>O: 5. 使用临时Token直传文件
O-->>U: 6. 返回文件URL
U->>S: 7. 通知上传成功(提交文件URL)
Note right of S: 保存文件信息到DB
这个方案的核心要点:
上传凭证由后端签发:后端完全掌控了上传的“准入”规则。它可以:
user_{uid}/avatar/{random_name}.jpg),避免覆盖和冲突。文件流前端直传:前端拿到凭证后,直接与OSS通信,享受高性能和稳定性。可以利用OSS SDK的强大功能,实现分片上传、断点续传和进度条。
后端负责最终登记:前端上传成功后,将最终的文件地址发送回后端,由后端将其与业务实体(如用户、文章)关联,并存入数据库。
(可选)结合云函数处理后续任务:如果文件上传后需要即时处理(如生成缩略图),可以配置OSS的事件触发器,当文件上传完成后,自动通知一个云函数(如Serverless Function)或消息队列,由它们来异步处理,从而不阻塞主上传流程。
对于绝大多数场景,“前端直传 + STS临时凭证 + 后端权限与控制” 是现代Web应用上传文件到OSS的最佳实践。
因此,在架构选型时,请优先考虑这种混合模式。它有效地在前端的灵活性与后端控制力之间取得了平衡,既能应对高并发海量文件上传的挑战,又能确保业务和数据的安全可靠。
本文作者:zjx171
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!