使用Node.js将Base64图像转换为原始二进制格式

11

我已经找到了一些与我所需内容相近的帖子,但是我无法成功地实现我想要的功能。这是一般的流程:

  1. 提交带有场馆其余数据的照片,作为base64数据
  2. 如果存在数据前缀,则剥离该前缀,以便我只有图像的base64数据

var base64data = venue.image.replace(/^data:image\/png;base64,|^data:image\/jpeg;base64,|^data:image\/jpg;base64,|^data:image\/bmp;base64,/, '');

  1. 使用MongoDB的GridFS(我正在使用gridfstore)存储Base64数据
  2. 然后,我想通过URL请求以原始图像文件的形式检索图像。

// generic images route
server.get(version+'/images/:id', function(req, res) {
  gridfstore.read( req.params.id, function(error,data) {
    res.writeHead(200, {
      'Content-Type': 'image/jpeg',
      'Content-Length': data.buffer.length
    });

    res.end(data.buffer);
  });
});

基本上,此方法返回存储在GridFS中的Base64字节。我尝试了其他方法,但它们不会返回原始图像。

我想使用像这样的URL来获取图像:

http://[localhost]/1/images/11dbcef0-257b-11e3-97d7-cbbea10abbcb

这是浏览器跟踪的截图: browser trace

2个回答

16

您可以从MongoDB中获取字符串,创建一个新的缓冲区实例,并在这样做时指定编码。结果缓冲区将是二进制数据。

var b64str = /* whatever you fetched from the database */;
var buf = Buffer.from(b64str, 'base64');

因此,在您的实现中:

server.get(version+'/images/:id', function(req, res) {
  gridfstore.read(req.params.id, function(err, data) {
    var img = Buffer.from(data.buffer, 'base64');

    res.writeHead(200, {
      'Content-Type': 'image/jpeg',
      'Content-Length': img.length
    });
    res.end(img); 

  });
});

谢谢@hexacyanide,我尝试了你建议的方法,但它返回一个无效的图像。缓冲区分配正确,长度准确,但图像就是不显示,所以我会再深入挖掘一下,看看能否提供更多信息。当我将Base64数据URI取出,并在HTML页面中用<img src:"[data uri]">显示时,它可以工作,所以至少我知道Base64是有效的。 - remotevision
我正在尝试简单地返回图像,就像您调用http://[somehost]/someimage.jpg一样。如果有帮助的话,我已经附上了屏幕截图。使用您建议的代码,浏览器只是卡住了。此外,我在服务器上使用Restify,但据我所读,它支持Node.js ServerResponse。http://mcavage.me/node-restify/#Content-Negotiation - remotevision
就我所见,这是GridFS中数据的内容。"data" : BinData(0,"ZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQWdB... - remotevision
我创建了2个Gist。其中一个有效,您将看到我在响应中添加了<img src>标记。因此,缓冲区仍包含图像的Base64编码数据。https://gist.github.com/remotevision/6708240 - remotevision
1
啊!我在将图像存储到GridFS时对其进行了Base64编码,因此它被双重编码了。现在我正在存储单个编码的图像,一切都正常工作了。谢谢你的帮助。 - remotevision
显示剩余4条评论

0

确保你的字符串是正确的。这对我有用。

var buf = new Buffer(b64stringhere, 'base64');
var express = require('express'), app = express();
app.get('/img', function(r, s){
    s.end(buf);
})
app.listen(80);

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