2

Node.jsサーバーとクライアントJSコード間の接続としてWebSocketを使用しています。

ソケットを介してさまざまなメディアタイプ(テキスト、オーディオ、ビデオ、画像)を送信したいと思います。もちろん、これは難しいことではありません。message.data instanceof Blobは、テキストをメディアファイルから分離します。問題は、これらのメディアファイルにいくつかの追加の属性を含めたいということです。

Fe:

  • 画像の寸法
  • 画像の名前。。。

これで、これらの情報を含む1つのメッセージをテキスト形式で送信し、その後にblobを含む別のメッセージを送信できます。ただし、オブジェクトを作成できるようにすることを強くお勧めします。

imageObject = {

xDimension : '50px',

yDimension : '50px', 

name : 'PinkFlowers.jpg'

imageData : fs.readFileSync(".resources/images/PinkFlowers.jpg")

}

そして、このオブジェクトをそのまま送信しますsocket.send(imageObject)

これまでのところ、これは実際に機能しますが、オブジェクトを収集して、クライアントでそのフィールドに再度アクセスできるようにするにはどうすればよいですか?

私はしばらくの間それを改ざんしてきました、そして私はどんな考えにも感謝するでしょう。

よろしくお願いします、

スティック

4

1 に答える 1

4

さて、base64を使用して動作させることができました。

サーバー側では、次のコードを実行しています。

var imageObject = newMessageObject('img', 'flower.png');
imageObject.image = new Buffer(fs.readFileSync('./resources/images/flower.png'), 'binary').toString('base64');
imageObject.datatype = 'png';
connection.send(JSON.stringify(imageObject));

有効な utf エンコーディングを保証するには、新しい Buffer() が必要です。なしで使用すると、Chrome (Firefox などについてはわかりません) はエラーをスローし、無効な utf8 エンコーディングが検出され、JSON.parse(メッセージ) の後に実行をシャットダウンします。注: newMessageObject は、私が使用する type と name の 2 つのフィールドを持つ単なるオブジェクト構築メソッドです。

クライアント側では、本当に簡単です:

websocketConnection.onmessage = function(evt) {
   var message = JSON.parse(evt.data);
   ... // Some app specific stuff
   var image = new Image();
   image.onload = function() {
     canvas.getContext("2d").drawImage(image, 0, 0);
   }

   image.src = "data:image/" + message.datatype + ";base64," + message.image;

}

これにより、キャンバスに画像が描画されます。

これがオーディオまたはビデオファイルに対して実用的であるとは確信していませんが、画像に対しては機能します。おそらく、オーディオ/ビデオ データの代わりに難読化された URL を送信し、サーバーからファイルを直接読み取る方法にフォールバックするでしょう。ただし、セキュリティへの影響は好きではありません。

于 2012-05-17T15:24:18.700 に答える