使用Node.js在MongoDB中存储图片:电商项目媒体文件存储方案咨询
线上商城多媒体文件存储方案解答
MongoDB与本地磁盘存储方案对比
如果你只能在这两种方案中二选一,优先选本地磁盘存储,不要选择MongoDB存多媒体文件,两者的优劣势如下:
- MongoDB存储(需使用GridFS拆分超过16MB的文件)
- 优势:数据和文件存在同一服务,不需要额外做存储权限适配,小Demo阶段开发速度快
- 劣势:会大幅提升数据库IO压力,高并发场景下很容易拖垮整个业务的数据库服务,数据库备份、迁移、扩容成本陡增,文件读写性能远低于专门的文件存储方案
- 本地磁盘存储
- 优势:文件读写速度快,开发成本极低,单机器小流量场景下足够使用
- 劣势:单服务器磁盘容量上限低,扩容麻烦,多机器部署时会出现文件同步问题,无法对接CDN加速,磁盘故障容易造成文件永久丢失,不支持高并发访问场景
实际商业项目主流推荐方案
正式对外运营的商业线上商城,几乎不会选择上述两种方案,优先选择云对象存储服务,特殊私有部署场景可选择自建开源对象存储集群,原因如下:
- 弹性扩容:存储容量、访问带宽都可以按需弹性扩展,不需要自己维护存储集群
- 性能更高:自带全球CDN加速能力,不同地区的用户访问多媒体文件的速度远高于自己部署的服务
- 成本更低:单位存储成本远低于自己买服务器磁盘,还不需要投入人力维护存储服务
- 功能丰富:自带图片裁剪、水印、视频转码、鉴权等常用能力,不需要自己写代码实现
- 数据安全:默认多副本备份,不会因为单机器故障丢失文件
如果是必须内网部署、不能使用公网云服务的场景,可以自己搭MinIO开源对象存储集群,API和公有云对象存储完全兼容,后续迁移也非常方便。
针对你的技术栈的实现建议
你用的Node.js + Express + MongoDB + React-Redux技术栈接入非常简单,核心逻辑如下:
- 后端使用
multer中间件接收前端上传的文件,开发测试阶段可以先存在本地磁盘,上线阶段直接调用对象存储的SDK上传文件,拿到文件的公网访问URL - 只需要把文件的URL存储在MongoDB对应的业务字段中,不需要存储文件本身
- 前端直接拿到URL渲染图片、播放视频即可,不需要占用业务服务器的带宽
学习资源推荐
- 接入公有云对象存储可以直接看对应厂商的Node.js SDK官方文档,都有完整的上传、签名、回调示例,半小时就能跑通基础流程
- 自建MinIO存储可以直接看MinIO官方的Node.js接入文档,API逻辑和公有云对象存储几乎一致,学习成本很低
multer中间件的基础使用可以直接搜索Express + Multer 文件上传的通用教程,核心逻辑非常简单,很容易上手
内容的提问来源于stack exchange,提问作者Gandom
相关产品推荐
相关产品推荐

