indexeddb ファイルにいくつかのデータがあり、ユーザーがそのデータをダウンロードして他のアプリケーションにインポートできるようにしたいと考えています。Blob を使用してこれを簡単に行うことができます。
var blob = new Blob(['herp!'], {type: 'application/octet-stream'});
var iframe = document.createElement("iframe");
iframe.id = "myiframe";
iframe.style.display = "none";
iframe.src = window.webkitURL.createObjectURL(blob); // needs a revokeObjectURL
$('#dlplaceholder').append(iframe);
Blob の正しい型パラメーターが重要です。text/plain に設定すると、ファイルはダウンロードされません。iframe の高さと幅、表示タイプがブロックの場合、iframe 内のデータを見ることができます。
ただし、データベースの複数の値から 1 つのファイルを作成したいと考えています。これらの値はそれぞれ大きくなる可能性があり、多くのエントリを持つことができます。これらの値を Blob コンストラクターで連結することはできますが、メモリ内にあまりにも多くのデータが存在することを心配しています。
そこで、サンドボックス化されたシステムでファイルを作成し、それに各値を追加して、ブロブの代わりにそのファイルを createObjectURL の引数として使用することにしました。しかし、それを行うと、ダウンロードされません。テキスト/プレーンのタイプで Blob コードを使用した場合とまったく同じように動作します。コードは次のとおりです。
var fname = 'mybadtest'; //UPDATE here's the problem: needs .bin file extension
var init_fs = function ( fs ) {
// first, write to the sandboxed file
fs.root.getFile(fname, {create: true, exclusive: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function(e) {
// write to file completed. now use the file for download
fs.root.getFile(fname, {}, function(fileEntry) {
fileEntry.file(function(file) {
var iframe = document.createElement("iframe");
iframe.id = "myiframe";
iframe.style.display = "none";
iframe.src = window.webkitURL.createObjectURL(file) // needs revokeObjURL
$('#dlplaceholder').append(iframe);
}, errorHandler);
}, errorHandler);
};
var blob = new Blob(['derp!'], {type: 'application/octet-stream'});
fileWriter.write(blob);
}, errorHandler);
}, errorHandler);
};
window.webkitStorageInfo.requestQuota(PERSISTENT, mysz, function(grantedBytes) {
window.webkitRequestFileSystem(PERSISTENT, grantedBytes, init_fs, errorHandler);
}, err_function );
iframe にサイズを指定して表示をブロックに設定すると、ファイルに書き込んだデータが表示されます。したがって、ファイル書き込み部分が正しくなったことがわかります。
ダウンロードできるようにファイルに適切なタイプを与える方法についてのアイデアはありますか? 私は MDN ドキュメント、HTML5 Rocks tuts、および Eric Bidelman の「Using the Filesystem API」の本を調べましたが、この状況に対処するものは何も見当たりません。Chrome バージョン 27.0.1453.110 を使用しています。
更新: 問題は解決しました。以下のコメントを参照してください。
更新された更新: 以下の代替アプローチに関する Rob W の有用なコメントを参照してください。