I am trying to save a binary object in redis and then serve it back as an image.
Here is the code I am using to save the data:
var buff=new Buffer(data.data,'base64');
client.set(key,new Buffer(data.data,'base64'));
Here is the code to dump the data out:
client.get(key,function(err,reply){
var data = reply;
response.writeHead(200, {"Content-Type": "image/png"});
response.end(data,'binary');
});
The first few byte of the data seem to be corrupted. The magic number is incorrect.
Did some experimenting:
when I do the following:
var buff=new Buffer(data.data,'base64');
console.log(buff.toString('binary'));
I get this:
0000000: c289 504e 470d 0a1a 0a00 0000 0d49 4844
when I do this
var buff=new Buffer(data.data,'base64');
console.log(buff);
I get the following:
Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00
I am not sure where the c2 is coming from
What worked for me is to use
data.toString('binary')
if it is aBuffer
. Also make sure not to reinterpret it asutf-8
, but also asbinary
.I was unable to figure out how to get the binary string to store.
Here is my workaround:
Where data is the data in base64 string
to serve the data:
This isn't ideal since you have to do the conversion every time, but it seem to work.
The problem is that the Redis client for Node converts responses to JavaScript strings by default.
I solved this by setting the
return_buffers
option totrue
when creating the client.See here for more details.
The problem with
return_buffers
is when you are not using pure buffer data's then you'll have to do something to convert other buffers to strings. Whiledetect_buffers
could be an option it is too unreliable.If you don't mind the extra computing cycles. You could also try: