如何在没有GridFS的NodeJS中使用MongoDB存储一些小文件(不足1MB)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (115)

我运行一个运行在NodeJS+MongoDB后端的网站。现在,我正在实现一个系统来存储需要在数据库中的一些图标(小图像文件)。

我需要保存的每个文件都在BSON最大文件下,所以我应该能够直接将它们保存到一个常规文档中。

我有两个问题:

1)与GridFS相比,在常规的mongo集合中保存图像文件可以吗?有什么我不该在这里考虑的吗?

2)如果我的思维过程是正确的,我该如何去做呢?我可以做以下几件事:

//assume 'things' is a mongoDB collection created properly using node-mongodb-driver

fs.readFile(pathToIconImage, function(err,image){
  things.insert({'image':image}, function(err,doc){
    if(err) console.log('you have an error! ' + err);
  });
});
提问于
用户回答回答于

要做到这一点,您需要对图像进行base 64编码,然后使用mongo的BinData类型存储它。这将把它保存为bson byte数组,而不是实际存储base 64字符串,因此大小不会比原始二进制图像大。

它将以base 64字符串的形式在json查询中显示,您可以使用该字符串获取二进制图像。

用户回答回答于
var fs = require('fs');
var mongo = require('mongodb').MongoClient;
var Binary = require('mongodb').Binary;

var archivobin = fs.readFileSync("vc.exe"); 
// print it out so you can check that the file is loaded correctly
console.log("Loading file");
console.log(archivobin);

var invoice = {};
invoice.bin = Binary(archivobin);

console.log("largo de invoice.bin= "+ invoice.bin.length());
// set an ID for the document for easy retrieval
invoice._id = 12345; 
  mongo.connect('mongodb://localhost:27017/nogrid', function(err, db) {
  if(err) console.log(err);
     db.collection('invoices').insert(invoice, function(err, doc){
    if(err) console.log(err);
  // check the inserted document
    console.log("Inserting file");
    console.log(doc);

    db.collection('invoices').findOne({_id : 12345}, function(err, doc){
      if (err) {
        console.error(err);
        }

      fs.writeFile('vcout.exe', doc.bin.buffer, function(err){
          if (err) throw err;
          console.log('Sucessfully saved!');
    });

    });
  });
});

扫码关注云+社区

领取腾讯云代金券