我在MongoDB集合中存储了小缩略图。虽然我可以使用.findOne()
提取它们,但我无法正确地通过ExpressJS路线为它们提供服务。
我没有将大拇指存放在磁盘上,因为heroku环境不保证持久存储。我没有使用GridFS,因为这些是拇指< 16MB。
在集合中插入一个新文档是这样的:
MongoClient.connect(url, function(err, db){
var newImg = fs.readFileSync(req.file.path);
var encImg = newImg.toString('base64');
var newItem = {
description: req.body.description,
date: Date(),
contentType: req.file.mimetype,
size: req.file.size,
img: Buffer(encImg)
};
db.collection('myimages')
.insert(newItem, function(err, result){
if (err) { console.log(err); }
});
});
我可以通过这样的Expressjs路线为img
提供服务:
router.get('/pictures/:picture', function(req, res){
/* my filename is actually a mdb oid */
var filename = req.params.picture;
MongoClient.connect(url, function(err, db){
db.collection('myimages')
.findOne({'_id': ObjectId(filename)}, function(err, results){
console.log(results); //<-- Output below
res.setHeader('content-type', results.contentType);
res.send(results.img);
});
});
});
nodejs console.log
返回一个这样的对象,
{ _id: 58f7ab923b7c842023cf80ec,
description: '',
date: 'Wed Apr 19 2017 13:25:22 GMT-0500 (CDT)',
contentType: 'image/jpeg',
size: 648436,
img:
Binary {
_bsontype: 'Binary',
sub_type: 0,
position: 864584,
buffer: <Buffer 2f 39 6a 2f 34 41 41 51 53 6b 5a 4a 52 67 41 42 41 51 41 41 53 41 42 49 41 41 44 2f 34 51 50 38 52 58 68 70 5a 67 41 41 54 55 30 41 4b 67 41 41 41 41 ... > }
}
但浏览器控制台给我一个错误:
Resource interpreted as Document but transferred with MIME type image/jpeg: "http://localhost:3000/picturewall/58f7ab923b7c842023cf80ec".
我错误地解开了吗?错误地设置了res
标题?
有人能告诉我我做错了吗?
答案 0 :(得分:1)
所以看起来就像在db中保存了base64图像。
你这样做img: Buffer(encImg)
。在node.js中,默认的缓冲区编码为utf8
,因此您的图像在db中保存为MongoDB中二进制类型下的base64 utf8字符串!
正确的方法是在保存图像时指定缓冲区编码:
// ...
img: Buffer.from(encImg, 'base64')
// ...
这样,当您以res.send(results.img.buffer);
向客户端发送响应时,您将发送二进制数据而不是base64字符串。