【问题标题】:insert video(bytes) sent from device in gridfs in mongodb node.js在 mongodb node.js 的 gridfs 中插入从设备发送的视频(字节)
【发布时间】:2015-03-23 18:17:00
【问题描述】:

我是 gridfs mongodb 的新手,我创建了一个 POST 服务来接收字节(视频)并希望将字节保存在 mongodb 中。我研究过gridfs,但无法获得清晰的画面。我已经编写了代码,但我不知道它是否足以处理大文件。或者如何从设备接收字节并以任何最佳方式存储在 gridfs 中?或任何其他方式来存储视频(字节)?很感谢任何形式的帮助。下面是代码。

var bytes = [];
bytes = req.param('video');
var db = new Db('myDB', new Server('localhost', 27017,{w:1}));

db.open(function(err, db) {
    // Our file ID
    var fileId = new ObjectID();

    // Open a new file
    var gridStore = new GridStore(db, fileId, 'w');
    gridStore.open(function(err, gridStore) {

        //Write a buffer
        gridStore.write(new Buffer(bytes), function(err, gridStore) {

            // Close the
            gridStore.close(function(err, result) {

                // Read back all the written content and verify the correctness
                GridStore.read(db, fileId, function(err, fileData) {

                    console.log(fileData);
                    db.close();
                });
            });
        });
        // });
    });
});

【问题讨论】:

    标签: node.js mongodb gridfs gridfs-stream


    【解决方案1】:

    我已经提供了在 mongodb 中插入 base64 字符串的示例。您可以使用它并将其应用于视频字节字符串。只需替换那个字符串。

    var mongo = require('mongodb');
        var Grid = require('gridfs-stream');
        var streamifier = require('streamifier');
    
        // create or use an existing mongodb-native db instance.
        // for this example we'll just create one:
        var db = new mongo.Db('mydb', new mongo.Server("127.0.0.1", 27017));
    
        // make sure the db instance is open before passing into `Grid`
        db.open(function(err) {
            if (err)
                return handleError(err);
            var gfs = Grid(db, mongo);
    
    
        var writestream = gfs.createWriteStream({
            mode: 'w',
            filename: 'dummy_video',  //        files.contentType  (Optional. A valid MIME type for the document.)
            content_type: 'video/mp4' //          files.filename (Optional. A human-readable name for the document.)
        });    
    
    
            var vidoBase64 = 'data:video/mp4;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAFpg2qXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MERENjc3QTVBNzlCMTFFNDlBM0JEN0VDQUUyNEIzODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MERENjc3QTZBNzlCMTFFNDlBM0JEN0VDQUUyNEIzODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowREQ2NzdBM0E3OUIxMUU0OUEzQkQ3RUNBRTI0QjM4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowREQ2NzdBNEE3OUIxMUU0OUEzQkQ3RUNBRTI0QjM4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pikq+moAAASaSURBVHjaYvz//z8DEGQwoIIZDECJjP+oACT2nwVJFSOUBhvBBOVIoxkFl3gGVfkfppMRatxvdB0AAQSSMAXSxshijP+hbkUWZEJzTRfIfGSVjOiuYERyBVwQ2dz/AAEE8qb2fyIByARbBvyAEeYOZNfyoUkyIrmNAV3xZyh9GsWdSIAF2atobAw+QAAx4oh0dPAGiNewoFuFDzARkOeAOqWQGMWKUNoC5kEGPJ76j80ZjDhCoxWI/wBxDjHOcIXazoyueD6ataDUaoZsG7Kbk4DYDk2DF3oMIgMVHM75hayYmIjZCxBAsOgG5T9JBuoBVVBgZFJgqAVa0t8JFb/NREqawwIuoPF3EJs+YSAZyVXyQHwDKv4DqfAA4X5cBi8A4lVIfE+oYfOQxB4BsSZU/AdU7DUQr0DxAVo5DOJ7ofHxYXS9ecgFFzrYhsR+hyd4hIB4OpQ9GV2SBU8pCAozQaTIfQvEd4DYHE1tMBCvI6VwgUWWOjS2haCG/gTiUiT5dVg1A4MDZOMaKH8jliRECqhHjjwQ1vlPPbALZCZAADEiVYUhQCxKYYY5C6tbWKAlz20qlhPPgVgKW+1NDaDDRIHm31jqXxiwo8Tgi3jk/jMx0AhQYrAmpQaDSjNlpHCMgopzoxWZ/0kxeD60/L2HJLYcS4WO18WghL0SiJ9A+X+h1TEuYILEXgt1BANyloaBCGj2fgPlTyGiPIYBSTR+BhOWIlQYKQcRC9yIiby/UDqGBIPPEGNwE5TWgEYcLvAQiX2VFINB4AEQO2JRsx+I5aDsraSkYyck9j5oGj0FxC+hbAckeR9SDAa5yApNDNSxEUPiv8CXnvFlkONQjQVA/A3NB/qEmmXItfRPHGomQjEpgBHZYFALqJGCQskMif0KVIPsATKcqVxqsoLC2AWId1PRUF1QDwMgwJDzvQ606h5sYBfUbQywZgULtAVF7WCmNtgLxB7oLTd6gltAPBParYIl+n9AzAVyGLQNiw5CWNAyP73AJWiZgAvMAeI8LNldjNKuGLngD3S0gNgyjPatKyLALyLam0T5ghIA6lM9hvarQPW8KhDLYEl2RkB8FIg7oA0M5ME8kJsCgbgEewsWc2iQVLAQiCWIaC4JQJtVlIAMSpLETSDmB+J4aE1NCHyADiuxQJsQVG3IB6H1VQ5haaKBWl6fyLDzL7THvAdLACDbmUqKg7nR0psdmvxaKqT3lWh80BCAOxKfi5pdJRUqOFiTwFAm2V2wy1jSHGgkK5ECx4Kau/loYveB+DA1HPwb6sC/aOKgUbKDQMxGomNBozubYUO1SACUeb9Sq/d8Bdq1eYsmbgdtScPGBUEhp4QkLwdNl61I44iBaGZ8hyaPw8Q4hJSK4ykQiwBxLDR00fUWQDEpIA/b6B+1xycWg1ro0M5MDxB/JEHvT+gwpRI0g00m1XJcIfyPCL0voCOPpUhiEtDhTxloYDyFjrO+INJMgm5gwVGUgNqjy8gI/RdQfJ0KxZ4LtmIP1IDXhmaqoQDAw41Xoa2q54PYoc+hbrzKiGXc1RRahIkwoM050gnA7HwDHQlCntZkAAD2FHBZPcvq3AAAAABJRU5ErkJggg==';//The base64 has a Video
        // if you are getting this byte string into chunks you need to man
    
    
        var byte_string = vidoBase64.substr(23);//The base64 has a imageURL
        var buffer = new Buffer(byte_string);   //new Buffer(b64string, 'base64');  you can use base64 encoding with creating new buffer string
        var response = streamifier.createReadStream(buffer).pipe(writestream);  // returns response which is having all information regarding saved byte string
        var lastInsertedFileId = response._store.fileId;  // now you can store it into another document for future use.
        console.log(lastInsertedFileId);   // this is _id saved in mydb.fs.files
             //Now you can check mydb.fs.files and mydb.fs.chunks document.
    
    
    
    
        });
    

    现在您可以通过以下代码提取相同输入数据的完整块---

            var output = '';
        var readStream = gfs.createReadStream({
            _id: lastInsertedFileId    // this id was stored in db when inserted a video stream above
        });
        readStream.on("data", function(chunk) {
            output += chunk;
        });
    
        // dump contents to console when complete
        readStream.on("end", function() {
            console.log("Final Output");
            console.log(output);
        });
    

    根据您的要求修改代码。

    谢谢

    【讨论】:

    • 谢谢。我需要知道文件名是什么以及视频的内容类型是什么。我认为这些也是可选的参数,仪式?还有如何获取 _id 唯一值?
    • 算出_id值我将使用mongodb的对象id。我还有一些疑问,您提到要替换视频的字节字符串,该字节字符串也会转换为“base64”吗?如何检查流是否已成功存储数据、任何状态,例如 req.on("end")
    • @Java_NewBie,我已经根据您的关注和要求更新了一些代码行。可能有助于满足您的要求。谢谢
    • 谢谢。我会试试这个。此外,如果 writeStream 成功完成,我使用 writeStream.on("finish") 检查流是否成功完成。这样可以吗?
    • streamifier.createReadStream() 是一个同步函数,所以你会得到上面那行代码的响应,这里不需要申请 on("finish")。
    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多