将二进制字符串转换为Node.js中的Buffers

时间:2012-11-11 22:52:16

标签: node.js mongodb binary mongoose

我有一个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的工作方式。还有另一种方法可以做我想做的事吗?

2 个答案:

答案 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缓冲区中。