socket.io,node.js将图像从服务器转发到客户端
问题描述:
我想通过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”库直接认可,或任何其他建议?
非常感谢!
答
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});
});
});
答
非常感谢的响应,
我做进一步测试和通过使用额外的缓冲变量在socket.emit的前面指定的类型中发现一种解决方法/溶液:
var nbuffer = new Buffer(msg.buffer,'image/jpeg');
socket.emit('serverImage', {image: true, buffer: nbuffer});
有了这个额外的步骤,浏览器现在将该消息识别为图像。 非常感谢您的帮助!
非常感谢您的回复。但是这仍然需要保存并将消息重新加载到磁盘!想转发没有fs的活动。 – cloud4every1
那你为什么不直接发回'msg.buffer'呢? –