[英]socket.io, node.js forwarding image from server to client
我想通過node.js上的socket.io接收圖像,並將其轉發到客戶端(瀏覽器),但是無法識別通過消息發送到瀏覽器的圖像,因此無法顯示。
但是,當我首先在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});
});
}
如果我簡化了用於轉發接收到的消息(msg)的功能,而沒有使用“ fs”解決方法,例如:
socket.emit('serverImage', {image: true, buffer: msg.buffer});
或以簡單的預期方式
socket.emit('serverImage', msg);
該郵件將不會在瀏覽器上被識別為圖像,並且客戶端不會觸發該圖像的“ onload”事件。 客戶端代碼(可以與jpeg文件一起使用):
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});
通過這一附加步驟,瀏覽器現在將消息識別為圖像。 非常感謝您的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.