首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用MongoDB在没有GridFS的NodeJS中存储一些小文件(小于1MB)

使用MongoDB在没有GridFS的NodeJS中存储一些小文件(小于1MB)
EN

Stack Overflow用户
提问于 2012-07-12 06:18:22
回答 2查看 28.9K关注 0票数 31

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

据我所知,不使用GridFS更有意义,因为它似乎是为大文件或大量文件量身定做的。因为我需要保存的每个文件都在BSON最大文件大小之下,所以我应该能够将它们直接保存到常规文档中。

我有两个问题:

1)我的推理正确吗?是否可以将图像文件保存在常规的mongo集合中,而不是使用GridFS?有没有什么是我在这里没有考虑的,而我应该考虑的?

2)如果我的思维过程是健全的,我该如何去做呢?我可以做下面这样的事情吗:

代码语言:javascript
复制
//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);
  });
});

我猜可能有一种更好的方法来做到这一点,因为mongoDB使用BSON,并且在这里,我正在尝试在将文件发送到数据库之前用JSON保存文件。我也不知道这段代码是否能工作(还没试过)。

更新-新问题

如果我在一个集合中有一个文档,其中保存了三部分信息: 1)名称、2)日期和3)图像文件(上面的图标),并且我想将该文档发送给客户端以显示所有这三个信息,这是可能的吗?如果不是,我想我需要使用GridFS并保存fileID来代替图像本身。想法/建议?

最好的,并感谢您的回复,

萨米语

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-12 06:50:37

如果您的图像确实足够小,不会成为文档大小的问题,并且您不介意进行一些额外的处理,那么直接将其存储在您的收藏中可能是可以接受的。为此,您需要对图像进行base64编码,然后使用mongo的BinData类型存储它。据我所知,这将把它保存为BSON位数组,而不是实际存储base64字符串,因此大小不会比原始的二进制图像大。

它将在json查询中显示为base64字符串,您可以使用该字符串获取二进制图像。

票数 36
EN

Stack Overflow用户

发布于 2016-04-26 00:11:54

我一直在找同样的东西。我知道这篇文章很陈旧,但也许我能帮上忙。

代码语言:javascript
复制
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!');
    });

    });
  });
});
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11442356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档