2014-03-06 26 views
0

我使用node.js v0.8建立客戶端/服務器套接字連接。客戶端將jpg編碼爲base64字符串並將其發送到服務器。服務器正在接收這些塊並將其寫入寫入流中。寫入數據後,新圖像文件與原始圖像文件具有相同的大小,但是當我嘗試打開它時會顯示損壞的消息。我是否用base64編碼或流寫入做錯了?將base64塊寫入writestream

Client.js和Server.js片段:

//Client sending base64 encoded string from image 

var net = require('net'); 
var fs = require('fs'); 

var socket = new net.Socket(); 

socket.connect(3000, '127.0.0.1', function() { 

    var stream = fs.createReadStream(__dirname + '/node.jpg', {encoding: 'base64'}); 

    stream.on('data', function(chunk){ 
     socket.write(chunk, 'base64'); 
    }); 

}); 


//Server should write base64 string into new image file 

var net = require('net'); 
var fs = require('fs'); 

var imageFilename = "node-copy.jpg"; 

var writeStream = fs.createWriteStream(__dirname + '/node-copy.jpg', {flags: 'a', encoding: 'base64'});  

var server = net.createServer(function(socket){ 

    socket.setEncoding('base64'); 

    socket.on("data", function(chunk){ 
    writeStream.write(chunk, 'base64'); 
    }); 

}).listen(3000, '127.0.0.1'); 
+0

你能解釋爲什麼你想把它編碼爲'base64'嗎?從你顯示的代碼中,沒有理由。 – loganfsmyth

+0

@loganfsmyth:我使用base64,因爲我想流二進制文件。有沒有另一種方法來做到這一點? – Flexer

+0

設置base64意味着文件在發送之前從二進制轉換爲字符串。只是省略了所有的編碼,它將默認作爲二進制發送。 – loganfsmyth

回答

0

你編碼每塊作爲單獨的實體,這是一種錯誤的做法。

使用流式base64模塊,如this one

+0

您是否知道如何在不使用第三方模塊的情況下編碼? – Flexer

+0

是的。編寫你自己的模塊來實現這個功能。 – alex