2013-09-25 76 views
9

我发现接近我正在查找的帖子,但是我一直无法成功实现我想要的内容。这里是一般流程:使用Node.js将Base64图像转换为原始二进制文件

  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,/, ''); 

经由MongoDB的
  • 商店的Base64在GridFS的数据(我使用gridfstore
  • 然后,我想根据请求通过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); 
        }); 
    }); 
    

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

    我想拉起使用URL这样的形象:

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

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

    回答

    15

    您可以从MongoDB的字符串,创建新的缓冲区实例,并在此时指定编码。由此产生的缓冲区将是二进制数据。

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

    因此,在您的实现:

    server.get(version+'/images/:id', function(req, res) { 
        gridfstore.read(req.params.id, function(err, data) { 
        var img = new Buffer(data.buffer, 'base64'); 
    
        res.writeHead(200, { 
         'Content-Type': 'image/jpeg', 
         'Content-Length': img.length 
        }); 
        res.end(img); 
    
        }); 
    }); 
    
    +0

    谢谢@hexacyanide,我试着你的建议,但它回来作为一个无效的形象。缓冲区是精确分配的,长度准确,但图像不显示,所以我会做更多的挖掘,看看我是否可以提供额外的信息。当我使用Base64数据URI,并将其显示在HTML页面中时,它可以工作,所以至少我知道Base64是有效的。 – remotevision

    +0

    那么你想做什么?你是否试图在页面上显示图像? – hexacyanide

    +0

    我试图简单地返回图像,就像你会打电话给http:// [somehost] /someimage.jpg。如果有帮助,我附上了截图。用你建议的代码,浏览器只是时钟。另外,我在服务器上使用Restify,但是从我读过的内容来看,它支持Node.js ServerResponse。 http://mcavage.me/node-restify/#Content-Negotiation – remotevision

    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); 
    
    +0

    是为我工作的 –

    相关问题