我是 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
我可以在数据库中看到记录大小。有二进制数据。记录大小也与文件大小相匹配。很开心。
现在,从 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.
最佳答案
这里的问题不在于存储和读取数据,而在于内容类型。因此,理想情况下,您希望将其与您的数据一起存储,并在发送响应时返回正确的 header 信息。
所以其中一部分是 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
});
编写 header 的方法各不相同,但您调用的 Node 的基本“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 中提供查找文档并直接在浏览器中查看的方法,就好像它是提供的常规图像文件一样。
关于node.js - 如何发送二进制数据以响应 node.js 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626541/