2017-08-29 154 views
0

我想通过node.js上的socket.io接收图像,并希望将其转发给客户端(浏览器),但通过消息将图像发送到浏览器无法识别,因此无法显示。socket.io,node.js将图像从服务器转发到客户端

但是,当我首先在node.js服务器上保存消息/图像并再次加载保存的文件以转发图像时,它工作正常。我也可以从文件系统上打开服务器上的jpeg文件,没有问题。直接从服务器发送不同的JPEG也如预期那样工作。

socket.on('image', function(msg) { 
     var fileName = 'clientImage.jpg'; 

     // First save the file 
     fs.writeFile(fileName, msg.buffer, function() {}); 

     // reload the image and forward it to the client 
     fs.readFile(__dirname +'/clientImage.jpg', function(err, buf){ 
      socket.emit('serverImage', {image: true, buffer: buf}); 
     }); 
    } 

如果我简化功能转发而不 “FS” 的解决方法接收到的消息(MSG),如:

socket.emit('serverImage', {image: true, buffer: msg.buffer}); 

或simples预期方式

socket.emit('serverImage', msg); 

的消息不会被识别为浏览器上的图像,并且客户端不会触发图像的“onload”事件。 客户端代码(使用JPEG Works文件罚款):

socket.on('serverImage', function(msg) { 
    var blob = new Blob([msg.buffer], {type: 'image/jpeg'}); 
    var url = URL.createObjectURL(blob); 
    var limg = new Image(); 
    limg.onload = function() { 
     console.log(' -- image on load!'); 
     rcontext.drawImage(this, 0, 0); 
     URL.revokeObjectURL(url); 
    }; 
    limg.src = url; 
}); 

有没有一种方式,可以将消息通过/转换某种程度上即编码,没有“FS”库直接认可,或任何其他建议?

非常感谢!

回答

0

writeFile是异步的。将文件写入磁盘需要时间。你传递了一个回调函数,但它是空的。重新读取该回调函数中的图像。

// First save the file 
fs.writeFile(fileName, msg.buffer 
    , function() { // When writing is done (that's the important part) 
     // reload the image and forward it to the client 
     fs.readFile(__dirname +'/clientImage.jpg', function(err, buf){ 
      socket.emit('serverImage', {image: true, buffer: buf}); 
     }); 
}); 
+0

非常感谢您的回复。但是这仍然需要保存并将消息重新加载到磁盘!想转发没有fs的活动。 – cloud4every1

+0

那你为什么不直接发回'msg.buffer'呢? –

0

非常感谢的响应,

我做进一步测试和通过使用额外的缓冲变量在socket.emit的前面指定的类型中发现一种解决方法/溶液:

var nbuffer = new Buffer(msg.buffer,'image/jpeg');   
socket.emit('serverImage', {image: true, buffer: nbuffer}); 

有了这个额外的步骤,浏览器现在将该消息识别为图像。 非常感谢您的帮助!

相关问题