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

如何从node.js服务器发送二进制数据作为响应,node.js,mongodb,http,Node.js,Mongodb,Http,我是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

我是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类型检测。有可用的模块,是其中之一吗

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中,您提供了在浏览器中直接查找文档和查看的方法,就像它是一个正在提供的常规图像文件一样。

您说过“它不适用于所有文件”。它为哪些文件工作,哪些文件不工作;有模式吗?还有,它是怎么工作的?是否有错误,文件是否损坏等?注意到GIF有时不工作。考虑使用GRIDFS,之后您将可以用以下方式编写:<代码>文件.Sturf(True).Pube(RES);<代码>在Mongodb中存储图像。不在GridFS上。将二进制数据存储到Mongodb中。findOne从Mongodb获取二进制数据。我应该为小于4MB的图像使用GridFS吗。请提出建议。如果您的文件小于4Mb,那么它将在没有GridFS的情况下工作。但是使用GridFS更灵活。它将允许您在将来不更改解决方案的情况下实现增长。应用程序将在content.length崩溃。所以,只添加了result.mimetye。对于一些文件来说,它工作得很好。并非所有文件都是如此。对于那些寻找它崩溃原因的人,应该是
result.content.buffer.length