我想通过node.js上的socket.io接收图像,并希望将其转发给客户端(浏览器),但是通过消息发送到浏览器的图像无法识别,因此无法显示。
但是,当我首先在node.js服务器上保存消息/图像并再次加载保存的文件以转发图像时,它可以正常工作。我也可以从文件系统中打开服务器上的jpeg文件而不会出现问题。直接从服务器发送不同的jpeg也可以按预期工作。
g.V('7112138f-fae6-4272-92d8-4f42e331b5e1').bothE('knows')
如果我简化了转发收到的消息(msg)的功能而没有" fs"解决方法,如:
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});
});
}
或以简单的预期方式
socket.emit('serverImage', {image: true, buffer: msg.buffer});
该消息不会被识别为浏览器上的图像,并且客户端不会触发" onload"图像的事件。 客户端代码(适用于jpeg文件):
socket.emit('serverImage', msg);
有没有一种方法可以以某种方式采用/转换消息,即编码,直接识别,而不需要" fs"图书馆或任何其他建议?
非常感谢!答案 0 :(得分: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});
});
});
答案 1 :(得分:0)
非常感谢回复,
我做了进一步的测试,并通过使用额外的缓冲区变量找到了一个变通方法/解决方案,指定了socket.emit前面的类型。
var nbuffer = new Buffer(msg.buffer,'image/jpeg');
socket.emit('serverImage', {image: true, buffer: nbuffer});
通过此附加步骤,浏览器现在将消息识别为图像。 非常感谢你的帮助!