【问题标题】:How to send binary data in response from node.js server如何从 node.js 服务器发送二进制数据作为响应
【发布时间】:2014-09-02 15:02:51
【问题描述】:

我是 mongodb 的新手。

我使用以下代码 sn-p 存储二进制数据:

var data = fs.readFileSync(path);
  var image = new mongodb.Binary(data);
  //open connection/collection
var record = {picname: id, content: image   };
collection.save(record, {safe: true}, function(err,result){
  if(err)
  console.log(err.stack);
  });//save

我可以看到 db 中的记录大小。有二进制数据。记录大小也与文件大小相匹配。很开心。

现在,从 mongo 检索到相同的二进制数据并尝试发送它作为响应:

var record = {picname: id};
  collection.findOne(record, function(err,result){
    if(err)
    console.log(err.stack);
    else
    {
    console.log('before read from db for download.');
    //HOW TO READ IMAGE/BINARY DATA FROM RESULT?
                                               //I need to send result in response. Any Idea?
    console.log('before read from db for download');
    }
    });

我正在使用以下代码 sn-p 发送二进制数据。它不适用于所有文件。可能是什么问题:

collection.findOne(record, function(err,result){
                if(err)
                    console.log(err.stack);
                else
                {
                    console.log('before read from db for download. result: [' + result.picname + " ], type: " + result.imagetype);
                    res.end(result.content.buffer, "binary");
                    console.log('Responded SUCCESS: ' + id );
                }
            });//findOne

请告诉我如何通过响应检索和发送。

提前致谢 DD。

【问题讨论】:

  • 您说“它不适用于所有文件”。它适用于哪些文件,不适用于哪些文件;有模式吗?另外,如何它不起作用?您是否收到错误,文件是否损坏等?
  • 注意到 gif 有时无法正常工作。
  • 考虑使用GridFS,之后就可以用下面的方式写了:file.stream(true).pipe(res);
  • 在 Mongodb 中存储图像。不在 GridFS 上。将二进制数据存储到 Mongodb 中。通过 findOne 从 Mongodb 获取二进制数据。我应该为小于 4MB 的图像使用 GridFS。请提出建议。
  • 如果你的文件小于 4Mb,它可以在没有 GridFS 的情况下工作。但是使用 GridFS 更灵活。它可以让您在不改变未来解决方案的情况下成长。

标签: node.js mongodb http


【解决方案1】:

您的问题不在于存储和读取数据,而实际上与内容类型有关。因此,理想情况下,您希望将其与数据一起存储,并在发送响应时返回正确的标头信息。

因此其中一部分将是 mime 类型检测。有可用的模块,mmmagic 就是其中之一

var Magic = require('mmmagic').Magic;

var magic = new Magic();

var data = fs.readFileSync(path);
var image = new mongodb.Binary(data);


//open connection/collection

magic.detect(data,function(err,result) {

    var record = {picname: id, content: image, mimeType: result };

    collection.save(record, {safe: true}, function(err,result){
        if(err)
            console.log(err.stack);
    });//save

});

编写标头的方法各不相同,但您调用的节点的基本“http”如下所示:

var record = {picname: id};
collection.findOne(record, function(err,result){
    if(err)
        console.log(err.stack);
    else {
        res.writeHead(200, {
            'Content-Type': result.mimeType,
            'Content-Length': result.content.length
        });
        res.write(result.content.buffer);
        res.end();
    }
});

因此,此处有效返回的是由正确的 mime 类型标识的二进制数据。因此,您可以从提供查找文档的方法的 URL 访问它,并直接在浏览器中查看,就像它是提供的常规图像文件一样。

【讨论】:

  • 应用程序在 content.length 处崩溃。所以,只添加了 result.mimetye。它适用于某些文件。不适用于所有文件。
  • 对于那些寻找崩溃原因的人来说,应该是result.content.buffer.length
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多