W tym kroku poznasz:
- Jak uzyskać odwołanie do pliku w zewnętrznym systemie plików.
- Jak zapisać dane w systemie plików.
Szacowany czas potrzebny na ukończenie tego kroku: 20 minut.
Aby zobaczyć podgląd czynności, które wykonasz w tym kroku, przeskocz na dół strony ↓.
Eksportuj zadania do wykonania
Spowoduje to dodanie do aplikacji przycisku eksportowania. Po kliknięciu bieżące zadania do wykonania są zapisywane w tekście wybrany przez użytkownika. Jeśli plik istnieje, zostanie zastąpiony. W przeciwnym razie zostanie utworzony nowy plik.
Aktualizuj uprawnienia
Żądanie uprawnień systemu plików może mieć postać ciągu tekstowego tylko do odczytu lub obiektu właściwości dodatkowych. Na przykład:
// 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"]}]
Musisz mieć uprawnienia do odczytu i zapisu. W pliku manifest.json poproś o {fileSystem: [ "write" ] }
uprawnienie:
"permissions": [
"storage",
"alarms",
"notifications",
"webview",
"<all_urls>",
{ "fileSystem": ["write"] }
],
Aktualizacja widoku HTML
W pliku index.html dodaj przycisk Eksportuj na dysk i div
, w którym aplikacja wyświetla komunikat o stanie:
<footer id="info">
<button id="toggleAlarm">Activate alarm</button>
<button id="exportToDisk">Export to disk</button>
<div id="status"></div>
...
</footer>
Poza tym w pliku index.html wczytaj skrypt export.js:
...
<script src="js/alarms.js"></script>
<script src="js/export.js"></script>
Utwórz skrypt eksportowania
Utwórz nowy plik JavaScript o nazwie export.js, korzystając z poniższego kodu. Zapisz go w folderze js.
(function() {
var dbName = 'todos-vanillajs';
var savedFileEntry, fileDisplayPath;
function getTodosAsText(callback) {
}
function exportToFileEntry(fileEntry) {
}
function doExportToDisk() {
}
document.getElementById('exportToDisk').addEventListener('click', doExportToDisk);
})();
Obecnie plik export.js zawiera tylko detektor kliknięć przycisku Eksportuj na dysk i krotki dla
getTodosAsText()
, exportToFileEntry
i doExportToDisk()
.
Otrzymuj zadania do wykonania w postaci tekstu
Zaktualizuj aplikację getTodosAsText()
, aby odczytywała zadania do wykonania z usługi chrome.storage.local
i generowała
ich reprezentację.
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));
}
Wybierz plik
Zaktualizuj aplikację doExportToDisk()
za pomocą atrybutu chrome.fileSystem.chooseEntry()
, aby użytkownik mógł wybrać
plik:
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);
}
}
Pierwszy parametr parametru chrome.fileSystem.chooseEntry()
jest obiektem opcji. Druga
jest metodą wywołania zwrotnego.
Jeśli masz już zapisany element FileEntry
, użyj go podczas połączenia z numerem exportToFileEntry()
. Plik
odwołania istnieją przez cały okres istnienia obiektu, który reprezentuje obiekt FileEntry
. Ten przykład wiąże
FileEntry
do okna aplikacji, aby kod JavaScript mógł zapisywać dane w wybranym pliku bez konieczności logowania się przez użytkownika
interakcji, dopóki okno aplikacji jest otwarte.
Używanie FileEntry do zapisywania zadań do wykonania na dysku
Zaktualizuj exportToFileEntry()
, aby zapisać zadania do wykonania jako tekst za pomocą interfejsu API internetowego FileEntry
:
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()
pobiera wyświetlaną ścieżkę pliku, która jest źródłem danych o stanie
div
Użyj narzędzia fileEntry.createWriter()
, aby utworzyć obiekt FileWriter
. fileWriter.write()
może wtedy zapisać
Blob do systemu plików. Użyj aplikacji fileWriter.onwriteend()
i fileWriter.onerror()
, aby zaktualizować
stan div
.
Aby dowiedzieć się więcej o FileEntry
, przeczytaj artykuł Poznaj interfejsy API FileSystem w HTML5Rocks lub
znajdziesz w FileEntry docs
w MDN.
Zachowuj obiekty FileEntry
Zaawansowane: FileEntry
obiektów nie można przechowywać w nieskończoność. Aplikacja musi zapytać użytkownika
aby móc wybierać plik przy każdym uruchomieniu aplikacji. Jeśli ponowne uruchomienie aplikacji zostało wymuszone z powodu czasu działania
awarii lub aktualizacji, restoreEntry() to opcja przywracania FileEntry
.
Jeśli chcesz, możesz poeksperymentować, zapisując identyfikator zwrócony przez funkcję retainEntry() i przywracając go w aplikacji
zrestartować. Wskazówka: dodaj detektor do zdarzenia onRestarted
na stronie w tle.
Uruchom gotową aplikację Todo
Krok 6 ukończony! Załaduj ponownie aplikację i dodaj zadanie do wykonania. Kliknij Eksportuj na dysk, aby wyeksportować do pliku .txt.
Więcej informacji
Szczegółowe informacje o niektórych interfejsach API wprowadzonych w tym kroku znajdziesz tutaj:
- Używanie interfejsu Chrome Filesystem API ↑
- Deklarowanie uprawnień ↑
- chrome.storage.local.get() ↑
- chrome.fileSystem.chooseEntry() ↑
- chrome.fileSystem.getDisplayPath() ↑
- chrome.fileSystem.restoreEntry() ↑
- chrome.fileSystem.retainEntry() ↑
Chcesz przejść dalej? Przejdź do Kroku 7 – Opublikuj aplikację »