私はキャンバス(1ビットピクセルの色深度)を取り、それをUint8Array(1バイトは8ピクセルを表す)に変換し、他の同様にエンコードされたメッセージを受信しながら送信するものを書いています。
私はblobがこの種のデータに適していると考え、blobを作成し、FormDataを作成し、そのblobをFormDataにアタッチしてから、次のように送信します。
function sendFormData(data){
//data.data is a Uint8Array other attributes are strings
var bytesBlob = new Blob([data.data],{type: "application/octet-stream"});
console.log(bytesBlob,data.data);
var form = new FormData();
var request = new XMLHttpRequest();
form.append("blob",bytesBlob,"message");
form.append("user",data.user);
form.append("colour",data.colour);
form.append("room",currentRoom);
request.open("POST","http://localhost:8080/",true);
request.send(form);
}
これで、blobの作成後にconsole.logを使用すると、blobの長さを確認できます。これは2035であり、Chromeにありますが、他のWebkitブラウザー(Safari)ではサイズは19です。
これは、Uint8Arrayからblobを作成するのではなく、「[objectUint8Array]」という単語からblobを作成しているためです。これは、明らかに誰にとっても有用ではありません。
サーバーからblobの1つをダウンロードすると、次のように表示されます。
$ cat blob-1 [object Uint8Array]
これは、ある時点でUint8ArrayオブジェクトがtoString()を取得した結果だと思いますが、実際のバイナリデータとして送信されるようにするにはどうすればよいですか?
ブロブを使用してこれを正しく実行しているのか、それともデータを送信するための最良の方法は何でしょうか?特に、ターゲットプラットフォームが「[objectUint8Array]」を攻撃する代わりに例外を発生させて停止するように見えるためです。
ターゲットプラットフォームはWebkitのみなので、他の種類のブラウザーについて心配する必要はありません。ありがとう。