2013-10-10 14 views
10

webRTCでFileShareアプリケーションを開発しています。 JavaScript/HTMLでクライアントを実装したいと思います。コードはクライアントブラウザで実行する必要があります。 webRTC経由でダウンロードしたときに保存する必要があります。ファイルは非常に大きい可能性があり、ファイルとしてディスクに保存する前に、それらを完全に読み込まずに配列やBLOBに保存することはできません。クライアントで生成されたデータをJavaScriptでファイルとしてチャンクに保存

ファイルを受信したときにファイルをチャンクに保存できるAPIはありますか?

私はこれまでにDownloadify,FileSave.jsおよびhtml5 FileWriterApiを見つけました。 最初の2つはチャンクされていませんが、保存する前に完全なファイルをメモリにダウンロードする必要がありますが、FileWriterAPIはほとんどのブラウザで使用できません。

+0

http://help.infragistics.com/Help/NetAdvantage/ASPNET/2013.1/CLR4.0/html/WebUpload_Saving_Files_as_Stream.html http://www.aurigma.com/docs/iu7/saving-uploaded- files-in-aspnet.htm 私はあなたを助けるかもしれないこの2つのリンクを持っています –

+0

適度なサイズのファイルのために、私の最初の本能はそれぞれの塊をそれ自身の 'Blob'に保存し、それらをすべてひとつの大きな' Blob' (新しいコンストラクタを使用して)最後に 'createObjectURL'を使用して最終的な' Blob'を保存します。IIRC、JS 'Blob'は必要に応じてディスクに保存されるので、ファイルが本当に巨大でない限り(または私が本当に間違っています))、あまりにも恐ろしいものではありませんか? –

+0

@JordanGray良いアイデアかもしれない - 私は、ダウンロードしたチャンクをブラウザセッション間で継続的にダウンロードする必要があると仮定したが、そうでない場合は、(ブラウザが必要なときにブロブをファイルに保存して実装する場合)最もクリーンなアイデアかもしれない。 –

答えて

11

でチャンクを節約し、より大きなブロブにそれらを結ぶカバーする必要があります:チャンクの

  • 持続性が必要とされていない(つまり、ブラウザを閉じるとすべてのチャンクが削除されます)
  • ファイルは、ユーザーが自分のファイルシステムに保存することによってのみ永続化されます。ユーザーが保存したファイルに再度アクセス権を与えない限り、Webアプリケーションは閉じられた後でファイルにアクセスできません。
  • おそらく、ファイルサイズが大きすぎない場合(おそらくそれを見つけるためにベンチマークする必要があります)。 Chromeは、1GBの合計でチャンクがうまく動いていました。

私はsimple test for using blobs as chunksを作成しました。あなたは、異なるサイズとチャンク番号パラメータで遊ぶことができます:あなたはその持続性を必要とした場合は

var chunkSize = 500000; 
var totalChunks = 200; 
var currentChunk = 0; 
var mime = 'application/octet-binary'; 
var waitBetweenChunks = 50; 

var finalBlob = null; 
var chunkBlobs =[]; 

function addChunk() { 
    var typedArray = new Int8Array(chunkSize); 
    chunkBlobs[currentChunk] = new Blob([typedArray], {type: mime}); 
    console.log('added chunk', currentChunk); 
    currentChunk++; 
    if (currentChunk == totalChunks) { 
     console.log('all chunks completed'); 
     finalBlob = new Blob(chunkBlobs, {type: mime}); 
     document.getElementById('completedFileLink').href = URL.createObjectURL(finalBlob); 
    } else { 
     window.setTimeout(addChunk, waitBetweenChunks); 
    } 
} 
addChunk(); 

、W3C File System APIはあなたが必要なものをサポートする必要があります。チャンクを別々のファイルに書き込んだり、すべてのチャンクが完成したら、それらをすべて読み込んで1つのファイルに追加したり、チャンクを削除したりすることができます。

アプリケーションにサンドボックスファイルシステムを割り当てて(指定されたクォータで)機能することに注意してください。ファイルはそのアプリケーションにのみアクセス可能です。ファイルがWebアプリケーションの外部で使用される場合は、ファイルをアプリケーションファイルシステムから通常のファイルシステムに保存する機能が必要になることがあります。 createObjectURL()メソッドを使用して、そのようなことを行うことができます。

ブラウザサポートの現在の状態については正しいですが、ファイルシステムのエミュレーションバックエンドとしてIndexedDB(もっと広くサポートされています)に基づいています。A Filesystem API polyfillが利用可能です。私は大きなファイルに対してポリフィルをテストしませんでした。サイズの制限やパフォーマンスの制限に遭遇する可能性があります。

+0

これは私が心に留めていたものです。仕様の私の理解に基づいて、チャンクは必要に応じて基盤となるストレージに保存されていて、適切に拡張できるはずです。 :) –

+0

これは、ディスクに保存する前に、まだ最初の '(currentChunk == totalChunks)'にまだ保存されているようですね。 – dman

+0

いいえ、新しいBlob()は、ディスク上のオブジェクトへのポインタを戻しているかのように思えます。 https://developer.mozilla.org/en/docs/Web/API/Blob –

3

https://github.com/Peer5/Sharefestにチェックを入れましたか?それは解決策であればあるかもしれないあなたの要件を示唆ヨルダン・グレー@として

+2

も同様に問題があるようです... https://github.com/Peer5/ShareFest/issues/53 –

関連する問題