在Node.js中将二进制字符串转换为缓冲区

3

我有一个 Web 服务,它接受一个表示图像的 Base64 编码字符串,使用 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
});

您会注意到,我正在使用“binary”编码创建一个缓冲区对象,而文档中说不要这样做:

'binary' - 一种将原始二进制数据编码为字符串的方法,只使用每个字符的前8位。这种编码方法已被弃用,应尽可能避免使用,而应使用Buffer对象。此编码将在Node的未来版本中被删除。

首先,我不确定他们在说什么。我正在尝试创建一个缓冲区对象,他们似乎暗示我应该已经有一个。
其次,问题的根源似乎是imagemagick调整大小方法返回包含二进制数据的字符串。typedef(stdout)返回“string”,将其打印到屏幕上似乎显示了一堆非字符数据。
那么我该怎么办呢?我不能改变imagemagick的工作方式。是否有另一种方法可以实现我想做的事情?
2个回答

3
这是我用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是否是最佳方法


在我的情况下,将它们存储为base64字符串仍然行不通,因为imagemagick库不会以这种方式返回它们。它似乎是一个实际包含非字符字节的字符串。我猜,我不太确定。我想我会联系那个库的所有者并问问他们发生了什么。 - d512
嗯... 但是,你试过我建议的方法吗?我猜想ImageMagick应该将其作为二进制数据返回,对吧?在这种情况下,将此二进制数据转换为其base64表示仍然是有效的,并且在检索时转换base64。 - Renato Gama

0

请尝试将此作为您的基础64处理,因为它可能没有预先处理:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接