2013-12-22 68 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

相關問題