1

ここで数回尋ねられた質問で、私は何時間も髪を引っ張ってきました: フラッシュ オーディオ レコーダーからのバイナリ データがあり、それを dataURL に変換し、アップロード用に blob に変換したい. SOは私にいくつかの答えを与えましたが、それらはすべて本質的に同じです:

上記を踏まえて以下のコードを書きました

var data = window.atob(dataURL.split(',')[1]);
var length = data.length;
var uInt8Array = new Uint8Array(length);
for (var i = 0; i < length; ++i) {
    uInt8Array[i] = data.charCodeAt(i);
}
var myfile = new Blob([uInt8Array], {'type': 'audio/x-wav'});

これは、firefox nightly (20) と chrome 25 では完全に機能しますが、chromium 20 では、myfile のサイズが 19 バイト (数 kb である必要がある場合) であると通知され続け、その後のアップロードは一貫して失敗します。これはクロムのバグですか、それともまだサポートされていないというドキュメントを見逃していましたか? 代替案はありますか?

4

2 に答える 2

1

Blob()特定のパラメーターで呼び出されたときに、クロムのコンストラクターにバグがあるようです。jsfiddleで問題を絞り込みました(クロムで実行して問題を確認してください。他のブラウザは適切に処理しているようです。両方のブロブ サイズは 32 である必要があります)。

これを回避するためにまとめたコードは次のとおりです。

var data = window.atob(dataURL.split(',')[1]);
var length = data.length;
var buffer = new ArrayBuffer(length);   // added this line
var uInt8Array = new Uint8Array(buffer);
for (var i = 0; i < length; ++i) {
    uInt8Array[i] = data.charCodeAt(i);
}
// two options here:
// buggy: produces a 19byte long file in chromium
var myfile = new Blob([uInt8Array], {'type': 'audio/x-wav'});
// works in chromium (and firefox), but produces a deprecation warning in chrome
var myfile = new Blob([buffer], {'type': 'audio/x-wav'});

私は最終的に最初の選択肢を実行し、if (myfile.size == 19) {必要に応じて2番目の選択肢を取得しました

于 2012-12-13T13:29:06.597 に答える