【问题标题】:Converting binary strings to Buffers in Node.js在 Node.js 中将二进制字符串转换为缓冲区
【发布时间】:2013-08-24 08:39:04
【问题描述】:

我有一个 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) return "string" 并将其打印到屏幕上肯定会显示一堆非字符数据。

那我在这里做什么?我无法改变 imagemagick 的工作方式。还有其他方法可以做我想做的事情吗?

【问题讨论】:

    标签: node.js mongodb binary mongoose


    【解决方案1】:

    这就是我成功的方式,将图像存储在 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 库不会以这种方式返回它们。它似乎是一个实际上包含非字符字节的字符串。我想,我不太确定。我想我会收容那个图书馆的所有者,问他们发生了什么事。
    • 嗯...但是,您是否尝试过我建议的方法?我猜图像魔法应该将它作为二进制数据返回,对吧?在这种情况下,将此二进制数据转换为其 base64 表示形式仍然有效,并且在检索时转换 from base64.
    【解决方案2】:

    请尝试此操作,因为您的 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 缓冲区中。

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 2014-02-21
      • 2020-05-10
      • 2011-09-20
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多