我有一个Web服务,它采用表示图像的base 64编码字符串,使用imagemagick库创建该图像的缩略图,然后将它们存储在mongodb中。我使用以下代码(大约)执行此操作:
var buf = new Buffer(req.body.data, "base64"); //original image
im.resize({ srcData: buf, width: 256 }, function(err, stdout, stderr) {
this.thumbnail = new Buffer(stdout, "binary");
//store buf and stdout in mongo
});
您会注意到我正在使用“二进制”编码创建一个Buffer对象,docs表示不这样做:
'binary' - 一种通过使用将原始二进制数据编码为字符串的方法 只有每个字符的前8位。这种编码方法是 不推荐使用,应该避免使用Buffer对象 可能。在将来的Node版本中将删除此编码。
首先,我不确定他们在那里说什么。我正在尝试创建一个Buffer对象,它们似乎意味着我应该已经有了一个。
其次,问题的根源似乎是imagemagick resize方法返回包含二进制数据的字符串。执行typedef(stdout)返回“string”并将其打印到屏幕上肯定会显示一堆非字符数据。
那我该怎么办?我无法改变imagemagick的工作方式。还有另一种方法可以做我想做的事吗?
答案 0 :(得分:2)
这就是我如何成功地将图像存储在mongodb中。
//original ---> base64
var thumbnail = new Buffer(req.body.data).toString('base64');
//you can store this string value in a mongoose model property, and save to mongodb
//base64 ---> image
var buffer = new Buffer(thumbnail, "base64");
我不确定将图像存储为base64是否是最好的方法
答案 1 :(得分:0)
请尝试此操作,因为您的base64可能无法预处理:
var imgRawData =
req.body.images[0].replace(/^data:image\/png;base64,|^data:image\/jpeg;base64,|^data:image\/jpg;base64,|^data:image\/bmp;base64,/, "");
var yourBuffer = new Buffer(imgRawData, "base64");
然后,将yourBuffer保存到MongoDB缓冲区中。