【问题标题】:How to upload blob object of type video/webm from nodejs to Mongo DB?如何将类型为 video/webm 的 blob 对象从 nodejs 上传到 Mongo DB?
【发布时间】:2017-05-14 19:30:20
【问题描述】:

我必须使用 NodeJS 将视频 blob 对象上传到 Mongo DB。 对于视频我使用 video.js https://github.com/collab-project/videojs-record 我正在使用 Ajax 调用将 blob 对象发送到 NodeJS,如下所示。

var file={
  name:'abc',
  data: player.recordedData.video
};
$.ajax({
        type: 'POST',
        url: '/uploadVideo',
        data: file,
        dataType: 'JSON'

}).done(function(data) {
                alert("success");
});

这里的文件是 JSON 对象,我想保存在我的集合中,其中包含文件名、blob 数据等其他字段。在 Node.js 端,我有以下代码

router.post('/uploadVideo',function (req, res ,next) {
    var file=req.body;
    console.log("file"+file);
    var collection = db.get('test');
                collection.insert(file, function(err, result){
                console.log('video saved in mongo db');
                    res.send(file);
                });

});

打印文件对象的控制台语句工作正常。 但是在 mongo DB 集合中插入 JSON 时出现 500 错误。

谁能为我提供在集合中插入 blob 的解决方案?如果我的代码有任何错误,请告诉我。 谢谢

【问题讨论】:

  • 请给我们完整的错误并执行console.log(typeof(file))之类的操作。
  • 当我打印 console.log(typeof(file)) 它在控制台上打印字符串。
  • 我发现在数据库中填充 blob 通常不是最好的主意。它通常更昂贵,并且通常还需要更多的工作。相反,我使用正确的工具来完成正确的工作。 Blob 到大容量存储(例如 S3,并且数据库记录或文档获取对其的 URL 引用。

标签: json node.js mongodb express blob


【解决方案1】:

我不确定您使用的是什么中间件?这是使用multerbody-parser 的工作示例。

重要的一段代码:-

表单数据字段名称 (uploadfile) 应匹配。然后使用fs从下载位置读取文件并将其设置在将插入到MongoDB集合中的文档中。

upload.single('uploadfile');


insertdata["file"] = fs.readFileSync(req.file.path);

表单数据字段名:-

File upload: <input type="file" name="uploadfile"><br>

完整的 HTML 表单:-

<form action="http://localhost:3000/filesave" enctype="multipart/form-data" method="post">
    Username: <input type="text" name="username"><br>
    File upload: <input type="file" name="uploadfile"><br>
    <input type="submit" value="Send">
</form>

工作代码:-

var express = require('express');
var Db = require('mongodb').Db,
    Server = require('mongodb').Server,
    bodyParser = require('body-parser')
    fs = require('fs');

var db = new Db('test', new Server('localhost', 27017));

var multer = require('multer');
var upload = multer({ dest: 'uploads/' });


var collection, dbObj;
module.exports = {

};

var app = express();

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded

var exports = module.exports;

app.post("/filesave", upload.single('uploadfile'), function (req, res) {
    db.open(function (err, success) {
        if (err) {
            console.log("DB connection error");
        } else {
            console.log("DB connection is successful");
            console.log(req.body.username);
            console.log(req.file);
            var insertdata  ={};
            insertdata["username"] = req.body.username;
            insertdata["file"] = fs.readFileSync(req.file.path);

            db.collection("filesave").insert(insertdata, function (inserr, result) {
                if (inserr) {
                    console.log(inserr);
                    db.close(true);
                    res.json(inserr);
                } else {
                    db.close(true);
                    res.json("Successfully persisted in database");
                }
            });
        }
    })


});

app.listen(3000);

保存在 MongoDB 集合中的数据:-

【讨论】:

  • 我们可以使用相同的代码来上传音频和视频文件吗?
  • 是的,数据保存为二进制。因此,您可以为音频和视频使用相同的代码。但是,MongoDB 集合的文档最大大小为 4 MB。如果数据可能超过 4 MB,您可能需要考虑在 MongoDB 中使用 GridFS 功能。此外,在渲染文件时,您可能需要使用正确的文件内容类型。
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 2014-09-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
相关资源
最近更新 更多