咨询2MB视频存入MongoDB的合适格式及服务端客户端实现方案
视频存储到MongoDB的可行方案
针对你的需求,视频存储到MongoDB主要有两种方案,适配不同大小的视频文件,客户端代码可沿用类似图片的POST上传逻辑,核心差异在服务端的存储处理:
1. 小视频(<16MB):直接存储二进制数据
和你存储图片的逻辑完全一致,MongoDB单文档支持最大16MB的二进制数据,只要视频文件不超过这个限制,直接以字节格式存储即可。
客户端代码修改(Locust)
仅需替换文件路径和字段名,逻辑和图片上传一致:
def training_task_video(self): if len(video_list): ran_num = random.randint(0, 7) time.sleep(ran_num) try: # 读取视频文件(二进制模式) with open(f"/Users/urooba/ramses/training_videos/{video_list[0]}", 'rb') as video: video_contents = video.read() data = { 'event_name': 'VIDEO_UPLOAD', } file = { 'input_video': video_contents } with self.lock: if len(video_list): self.client.post(url=self.host, files=file, data=data) del(video_list[0]) except Exception as e: print(f"[EXCEPTION - VIDEO] {e}")
2. 大视频(≥16MB):使用GridFS分块存储
如果视频文件超过16MB,MongoDB单文档无法容纳,这时需要用GridFS——它会自动将大文件分割成多个256KB的块存储,同时维护一个元数据文档记录文件信息。
客户端代码
客户端无需额外改动,依然用上述POST上传逻辑,把视频以二进制形式发送即可。
服务端处理示例(Python + Flask + PyMongo)
服务端接收视频后,用GridFS写入MongoDB:
from flask import Flask, request from pymongo import MongoClient from gridfs import GridFS app = Flask(__name__) client = MongoClient('mongodb://localhost:27017/') db = client['video_storage_db'] fs = GridFS(db) @app.route('/upload-video', methods=['POST']) def upload_video(): event_name = request.form.get('event_name') video_file = request.files.get('input_video') # 将视频写入GridFS,可附加元数据(比如event_name) file_id = fs.put(video_file, filename=video_file.filename, event_name=event_name) return {'file_id': str(file_id), 'status': 'success'}, 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
方案选择建议
- 若视频均小于16MB,优先选方案1,实现简单,和你现有图片存储逻辑统一;
- 若存在大视频,必须用GridFS,避免MongoDB的单文档大小限制;
- 后续读取视频时,方案1直接从文档中取出二进制数据返回,方案2通过GridFS的
get(file_id)方法读取拼接块数据。
内容的提问来源于stack exchange,提问作者Urooba Shahid
相关产品推荐
相关产品推荐

