このステップでは、次のことを学習します。
- 外部ファイル システム内のファイルへの参照を取得する方法。
- ファイルシステムへの書き込み方法。
このステップの所要時間: 20 分
このステップで完了する内容をプレビューするには、このページの下部に移動 ↓してください。
タスクをエクスポートする
このステップでは、アプリにエクスポート ボタンを追加します。このボタンをクリックすると、現在の ToDo リストがユーザーが選択したテキスト ファイルに保存されます。ファイルが存在する場合、ファイルが置き換えられます。存在しない場合は、新しいファイルが作成されます。
許可を更新
ファイル システム権限は、読み取り専用アクセスの文字列として、または追加のプロパティを持つオブジェクトとしてリクエストできます。次に例を示します。
// Read only
"permissions": ["fileSystem"]
// Read and write
"permissions": [{"fileSystem": ["write"]}]
// Read, write, autocomplate previous input, and select folder directories instead of files
"permissions": [{"fileSystem": ["write", "retainEntries", "directory"]}]
読み取り / 書き込みアクセス権が必要です。manifest.json で、{fileSystem: [ "write" ] }
権限をリクエストします。
"permissions": [
"storage",
"alarms",
"notifications",
"webview",
"<all_urls>",
{ "fileSystem": ["write"] }
],
HTML ビューを更新する
index.html に [Export to disk] ボタンと、アプリがステータス メッセージを表示する div
を追加します。
<footer id="info">
<button id="toggleAlarm">Activate alarm</button>
<button id="exportToDisk">Export to disk</button>
<div id="status"></div>
...
</footer>
index.html で、export.js スクリプトも読み込みます。
...
<script src="js/alarms.js"></script>
<script src="js/export.js"></script>
エクスポート スクリプトを作成する
次のコードを使用して、export.js という名前の新しい JavaScript ファイルを作成します。js フォルダに保存します。
(function() {
var dbName = 'todos-vanillajs';
var savedFileEntry, fileDisplayPath;
function getTodosAsText(callback) {
}
function exportToFileEntry(fileEntry) {
}
function doExportToDisk() {
}
document.getElementById('exportToDisk').addEventListener('click', doExportToDisk);
})();
現在、export.js には、[ディスクにエクスポート] ボタンのクリック リスナーと、getTodosAsText()
、exportToFileEntry
、doExportToDisk()
のスタブのみが含まれています。
やることリストをテキストとして取得する
getTodosAsText()
を更新して、chrome.storage.local
から ToDo を読み取り、テキスト形式で生成するようにします。
function getTodosAsText(callback) {
chrome.storage.local.get(dbName, function(storedData) {
var text = '';
if ( storedData[dbName].todos ) {
storedData[dbName].todos.forEach(function(todo) {
text += '- ';
if ( todo.completed ) {
text += '[DONE] ';
}
text += todo.title;
text += '\n';
}, '');
}
callback(text);
}.bind(this));
}
ファイルを選択
ユーザーがファイルを選択できるように、doExportToDisk()
を chrome.fileSystem.chooseEntry()
に更新します。
function doExportToDisk() {
if (savedFileEntry) {
exportToFileEntry(savedFileEntry);
} else {
chrome.fileSystem.chooseEntry( {
type: 'saveFile',
suggestedName: 'todos.txt',
accepts: [ { description: 'Text files (*.txt)',
extensions: ['txt']} ],
acceptsAllTypes: true
}, exportToFileEntry);
}
}
chrome.fileSystem.chooseEntry()
の最初のパラメータはオプションのオブジェクトです。2 番目のパラメータはコールバック メソッドです。
FileEntry
がすでに保存されている場合は、exportToFileEntry()
を呼び出すときにその FileEntry
を使用します。ファイル参照は、FileEntry
を表すオブジェクトの存続期間中存在します。この例では、FileEntry
をアプリ ウィンドウに関連付けているため、アプリ ウィンドウが開いている限り、JavaScript コードはユーザー操作なしで選択したファイルに書き込むことができます。
FileEntry を使用して ToDo アイテムをディスクに書き込む
exportToFileEntry()
を更新して、FileEntry
Web API を介して ToDo をテキストとして保存します。
function exportToFileEntry(fileEntry) {
savedFileEntry = fileEntry;
var status = document.getElementById('status');
// Use this to get a file path appropriate for displaying
chrome.fileSystem.getDisplayPath(fileEntry, function(path) {
fileDisplayPath = path;
status.innerText = 'Exporting to '+path;
});
getTodosAsText( function(contents) {
fileEntry.createWriter(function(fileWriter) {
var truncated = false;
var blob = new Blob([contents]);
fileWriter.onwriteend = function(e) {
if (!truncated) {
truncated = true;
// You need to explicitly set the file size to truncate
// any content that might have been there before
this.truncate(blob.size);
return;
}
status.innerText = 'Export to '+fileDisplayPath+' completed';
};
fileWriter.onerror = function(e) {
status.innerText = 'Export failed: '+e.toString();
};
fileWriter.write(blob);
});
});
}
chrome.fileSystem.getDisplayPath()
は、ステータス div
に出力する表示可能なファイルパスを取得します。
fileEntry.createWriter()
を使用して FileWriter
オブジェクトを作成します。fileWriter.write()
は、Blob をファイルシステムに書き込むことができます。fileWriter.onwriteend()
と fileWriter.onerror()
を使用して、ステータス div
を更新します。
FileEntry
の詳細については、HTML5Rocks の Exploring the FileSystem APIs をご覧ください。または、MDN の FileEntry docs
をご覧ください。
FileEntry オブジェクトを保持する
詳細: FileEntry
オブジェクトを無期限に保持することはできません。アプリは、起動するたびにユーザーにファイルの選択を求める必要があります。ランタイム クラッシュまたは更新によりアプリが強制的に再起動された場合は、restoreEntry() を使用して FileEntry
を復元できます。
必要に応じて、retainEntry() によって返された ID を保存し、アプリの再起動時に復元してテストします。(ヒント: バックグラウンド ページの onRestarted
イベントにリスナーを追加します)。
完成した ToDo アプリを起動する
ステップ 6 は完了です。アプリを再読み込みして、ToDo を追加します。[Export to disk] をクリックして、ToDo を .txt ファイルにエクスポートします。
詳細情報
このステップで説明した API の詳細については、以下をご覧ください。
- Chrome Filesystem API の使用 ↑
- 権限を宣言する ↑
- chrome.storage.local.get() ↑
- chrome.fileSystem.chooseEntry() ↑
- chrome.fileSystem.getDisplayPath() ↑
- chrome.fileSystem.restoreEntry() ↑
- chrome.fileSystem.retainEntry() ↑
次のステップに進む準備はできていますか?ステップ 7 - アプリを公開する » に進みます。