In deze stap leer je:
- Hoe u een verwijzing naar een bestand in het externe bestandssysteem kunt krijgen.
- Hoe naar het bestandssysteem te schrijven.
Geschatte tijd om deze stap te voltooien: 20 minuten.
Om een voorbeeld te zien van wat u in deze stap gaat voltooien, springt u naar de onderkant van deze pagina ↓ .
Exporteer taken
Met deze stap wordt een exportknop aan de app toegevoegd. Wanneer erop wordt geklikt, worden de huidige taken opgeslagen in een door de gebruiker geselecteerd tekstbestand. Als het bestand bestaat, wordt het vervangen. Anders wordt er een nieuw bestand gemaakt.
Machtigingen bijwerken
Bestandssysteemmachtigingen kunnen worden aangevraagd als een tekenreeks voor alleen-lezen toegang, of als een object met aanvullende eigenschappen. Bijvoorbeeld:
// 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"]}]
U hebt lees- en schrijftoegang nodig. Vraag in manifest.json de machtiging {fileSystem: [ "write" ] }
aan:
"permissions": [
"storage",
"alarms",
"notifications",
"webview",
"<all_urls>",
{ "fileSystem": ["write"] }
],
HTML-weergave bijwerken
Voeg in index.html een knop Exporteren naar schijf toe en een div
waarin de app een statusbericht toont:
<footer id="info">
<button id="toggleAlarm">Activate alarm</button>
<button id="exportToDisk">Export to disk</button>
<div id="status"></div>
...
</footer>
Laad ook in index.html het export.js -script:
...
<script src="js/alarms.js"></script>
<script src="js/export.js"></script>
Exportscript maken
Maak een nieuw JavaScript-bestand met de naam export.js met behulp van de onderstaande code. Sla het op in de js- map.
(function() {
var dbName = 'todos-vanillajs';
var savedFileEntry, fileDisplayPath;
function getTodosAsText(callback) {
}
function exportToFileEntry(fileEntry) {
}
function doExportToDisk() {
}
document.getElementById('exportToDisk').addEventListener('click', doExportToDisk);
})();
Op dit moment bevat export.js alleen een kliklistener op de knop Exporteren naar schijf en stubs voor getTodosAsText()
, exportToFileEntry
en doExportToDisk()
.
Ontvang taken als tekst
Update getTodosAsText()
zodat het de taken van chrome.storage.local
leest en er een tekstuele weergave van genereert:
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));
}
Kies een bestand
Update doExportToDisk()
met chrome.fileSystem.chooseEntry()
zodat de gebruiker een bestand kan kiezen:
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);
}
}
De eerste parameter van chrome.fileSystem.chooseEntry()
is een object met opties. De tweede parameter is een callback-methode.
Als er al een opgeslagen FileEntry
is, gebruik die dan bij het aanroepen van exportToFileEntry()
. Bestandsreferenties bestaan gedurende de levensduur van het object dat de FileEntry
vertegenwoordigt. In dit voorbeeld wordt FileEntry
aan het app-venster gekoppeld, zodat de JavaScript-code zonder enige gebruikersinteractie naar het geselecteerde bestand kan schrijven, zolang het app-venster open blijft.
Gebruik FileEntry om takenitems naar schijf te schrijven
Update exportToFileEntry()
om de taken als tekst op te slaan via de FileEntry
Web API:
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()
haalt een weer te geven bestandspad op dat wordt uitgevoerd naar de status div
.
Gebruik fileEntry.createWriter()
om een FileWriter
object te maken. fileWriter.write()
kan vervolgens een Blob naar het bestandssysteem schrijven. Gebruik fileWriter.onwriteend()
en fileWriter.onerror()
om de div
bij te werken.
Voor meer informatie over FileEntry
leest u Exploring the FileSystem APIs on HTML5Rocks, of raadpleegt u de FileEntry docs
op MDN.
Persist FileEntry-objecten
Geavanceerd : FileEntry
objecten kunnen niet voor onbepaalde tijd worden bewaard. Elke keer dat de app wordt gestart, moet uw app de gebruiker vragen een bestand te kiezen. Als uw app opnieuw moest worden opgestart vanwege een runtime-crash of -update, is herstelEntry() een optie om een FileEntry
te herstellen.
Als u wilt, kunt u experimenteren door de ID op te slaan die wordt geretourneerd door retainEntry() en deze te herstellen wanneer de app opnieuw wordt opgestart. (Tip: voeg een luisteraar toe aan de onRestarted
-gebeurtenis op de achtergrondpagina.)
Start uw voltooide Todo-app
Je bent klaar Stap 6! Laad uw app opnieuw en voeg enkele taken toe. Klik op Exporteren naar schijf om uw taken naar een .txt-bestand te exporteren.
Voor meer informatie
Voor meer gedetailleerde informatie over enkele van de API's die in deze stap zijn geïntroduceerd, raadpleegt u:
- De Chrome-bestandssysteem-API gebruiken ↑
- Verklaar machtigingen ↑
- chrome.storage.local.get() ↑
- chrome.fileSystem.chooseEntry() ↑
- chrome.fileSystem.getDisplayPath() ↑
- chrome.fileSystem.restoreEntry() ↑
- chrome.fileSystem.retainEntry() ↑
Klaar om door te gaan naar de volgende stap? Ga naar Stap 7 - Publiceer uw app »