2013-12-22 150 views
10

我试图在redis中保存一个二进制对象,然后将其作为图像提供回来。如何使用节点在redis中存储二进制对象?

这里是我用来保存数据的代码:

var buff=new Buffer(data.data,'base64'); 
client.set(key,new Buffer(data.data,'base64')); 

这里是转储数据出代码:

client.get(key,function(err,reply){ 
     var data = reply; 
     response.writeHead(200, {"Content-Type": "image/png"}); 
     response.end(data,'binary'); 

}); 

数据的前几个字节似乎是损坏。幻数不正确。

有没有一些试验:

,当我做到以下几点:

var buff=new Buffer(data.data,'base64'); 
console.log(buff.toString('binary')); 

我得到这个:

0000000:C289 504E 470D 0a1a 0A00 0000 0d49 4844

当我做此

var buff=new Buffer(data.data,'base64'); 
console.log(buff); 

我得到如下:

缓冲器89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00

我不知道在哪里的C2将

+0

没有用这种方式处理图像,但不应该“解码”在“base64”中编码的内容? – Gntem

+0

如果你'console.log(回复)',你会得到什么?您还可以通过将图像放入Redis来详细说明您正在尝试完成的任务吗?这不是存储大量二进制数据的最佳方式。 – loganfsmyth

+0

数据作为base64试图保存二进制文件 – SamFisher83

回答

1

我来了无法弄清楚如何获取二进制字符串来存储。

这里是我的解决方法:

如果数据是用base64字符串数据

client.set(count,data); 

服务数据:

client.get(last,function(err,reply){ 
    var data = reply; 
    response.writeHead(200, {"Content-Type": "image/png"}); 
    var buff=new Buffer(data,'base64'); 
    response.end(buff); 
}); 

因为你必须要做到这一点并不理想转换每次,但它似乎工作。

9

问题是,默认情况下,节点的Redis客户端将响应转换为JavaScript字符串。

我通过在创建客户端时将return_buffers选项设置为true来解决此问题。

var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true}); 

查看here了解更多详情。

1

return_buffers的问题是当你不使用纯缓冲区数据的时候,你将不得不做一些事情来将其他缓冲区转换为字符串。虽然detect_buffers可能是一个选项,但它太不可靠了。

如果你不介意额外的计算周期。您也可以尝试:

// convert your buffer to hex string 
client.set(key, mybuffer.toString('hex')); 
// create a new buffer from hex string 
client.get(key, function (err, val) { 
    var bin = new Buffer(val, 'hex'); 
}); 
+0

在大多数情况下,base64是一个更好的选择,因为它会产生比hex更小的消息(以更昂贵的编码为代价)。 – Gajus

0

什么工作对我来说是使用data.toString('binary')如果它是一个Buffer。另外请确保不要将其重新解释为utf-8,还应该将其解释为binary

相关问题