繁体   English   中英

如何从Node.js服务器响应发送二进制数据

[英]How to send binary data in response from node.js server

我是mongodb的新手。

我用下面的代码片段存储了二进制数据:

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');
    }
    });

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

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。

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

因此,其中一部分将是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进行访问,在URL中您可以提供查找文档并直接在浏览器中查看的方式,就像提供的是常规图像文件一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM