Как сохранить двоичный объект в redis с помощью node?
Я пытаюсь сохранить двоичный объект в 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 исходит из
Ответы
Ответ 1
Проблема заключается в том, что клиент Redis для Node по умолчанию преобразует ответы на строки JavaScript.
Я решил это, установив параметр return_buffers
в true
при создании клиента.
var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});
Подробнее см. здесь.
Ответ 2
Мне не удалось выяснить, как получить двоичную строку для хранения.
Вот мой способ:
Где данные - это данные в строке 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);
});
Это не идеально, потому что вы должны делать конверсию каждый раз, но, похоже, это работает.
Ответ 3
Проблема с 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');
});
Ответ 4
Что сработало для меня, это использовать data.toString('binary')
, если это Buffer
. Также не переучивайте его как utf-8
, но также как binary
.