0

ファイル転送サービスを構築するために WebRTC データ チャネルを使用しています。

30Mb程度以下の小さなファイルではうまくいきます。現在、受信側ではファイル データをメモリに保存しているだけです。すべてのデータが転送されたら、ファイルを保存します。

このようなちょっと:

//On the recieving side
var dataArray = [];
var dcOnMessage= function(event){
    dataArray .push(event.data);
    if(bytesToRecieve == 0)
    {
        var blob = new Blob(dataArray ,{type: incFileDesc.type});
        reader.onload = function (event) {
            saveToDisk(event.target.result,incFileDesc.name);
        }
        reader.readAsDataURL(blob);
    }
}

var saveToDisk = function(fileUrl, fileName) {
        var save = document.createElement('a');
        save.href = fileUrl;
        save.target = '_blank';
        save.download = fileName || fileUrl;
        var event = document.createEvent('Event');
        event.initEvent('click', true, true);

        save.dispatchEvent(event);
        (window.URL || window.webkitURL).revokeObjectURL(save.href);
    }

したがって、データをディスク上のファイルに保存し、そのファイルに直接書き込みたいと考えています。しかし、どうすればそれを行うことができますか?

4

3 に答える 3

1

残念ながら、現在の標準化された API では、これを簡単に行うことはできません (Philipp の回答を参照)。最も近いのは、それぞれを blob/etc として localstorage/indexeddb に保存し、Blob コンストラクターを使用して一連の blob から最終的なファイルを構築することです。約 2 倍のファイルサイズの一時的なメモリ ヒットがまだあります。または、最終的な BLOB を構築してディスクに保存するまで、メモリ内の各 BLOB を保持します (メモリ ヒットは引き続き発生しますが、最終的な BLOB を構築するときに 2 倍になるまで徐々に)。これらは、最終的なファイルのサイズが使用可能な RAM の大きさの範囲内になると、問題が発生し始める可能性があります。

現在、Firefox から Firefox への単一の大きな Blob の直接転送は、非推奨の低レベルのチャンク メカニズムを使用して SCTP ndata サポート (まだ利用できません) なしで動作します。メモリ ヒットの 2 倍の部分を回避します。

Chrome には、ファイルへの追加部分をほとんど実行できる非標準 API があり、最後に確認しました。これは、WebAPI 関係者との間で継続的に議論されている分野です。おそらく再びそれらを突く時が来ました。

于 2015-04-21T13:36:19.563 に答える
1

(セキュリティ上の理由から) ファイルをディスクに保存することはできないと思いますが、BLOB として indexedDB に保存することはできます。IndexedDB は現在広くサポートされており ( http://caniuse.com/#search=indexeddbを参照)、ローカルの大きなオブジェクト ストアに適しています。API の詳細については、https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_APIを参照してください。BLOB を IndexedDB に保存する例を次に示します: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/

于 2015-04-17T14:55:16.910 に答える