如何使用节点在redis中存储二进制对象?

Sam*_*r83 18 redis node.js node-redis

我试图在redis中保存二进制对象,然后将其作为图像提供.

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

var buff=new Buffer(data.data,'base64');
client.set(key,new Buffer(data.data,'base64'));
Run Code Online (Sandbox Code Playgroud)

以下是转储数据的代码:

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

});
Run Code Online (Sandbox Code Playgroud)

数据的前几个字节似乎已损坏.神奇的数字不正确.

做了一些试验:

当我做以下事情时:

var buff=new Buffer(data.data,'base64');
console.log(buff.toString('binary'));
Run Code Online (Sandbox Code Playgroud)

我明白了:

0000000:c289 504e 470d 0a1a 0a00 0000 0d49 4844

当我这样做

 var buff=new Buffer(data.data,'base64');
 console.log(buff);
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

缓冲液89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00

我不确定c2来自哪里

mb.*_*mb. 21

问题是Redis Client for Node默认情况下会将响应转换为JavaScript字符串.

我通过在创建客户端时设置return_buffers选项来解决这个问题true.

var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见此处


gra*_*has 5

我遇到了类似的问题,就我而言,问题在于我如何将数据从 Redis 获取到 Nodejs。在我的例子中,来自 Nodejs 的值被正确存储,但是当它进入 Node 时,它​​被转换为 ASCII 字符串。我能够使用以下行将其强制到缓冲区。

let file = await r.get(redis.commandOptions({ returnBuffers: true }), `zip/${req.params.taskId}`)
Run Code Online (Sandbox Code Playgroud)


Sam*_*r83 2

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

这是我的解决方法:

其中data是base64字符串中的数据

client.set(count,data);
Run Code Online (Sandbox Code Playgroud)

提供数据:

 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);
});
Run Code Online (Sandbox Code Playgroud)

这并不理想,因为您每次都必须进行转换,但它似乎有效。