Presque tous les aspects du développement d'applications impliquent l'envoi ou la réception de données. Démarrage... avec les principes de base, utilisez un framework MVC pour concevoir et implémenter votre application de manière à sont complètement distinctes de la vue de l'application sur ces données (consultez la section Architecture MVC).
Vous devez également réfléchir à la façon dont les données sont gérées lorsque votre application est hors connexion (voir la section Premièrement hors connexion). Ce document présente brièvement les options de stockage permettant d'envoyer, de recevoir et d'enregistrer des données localement. la Le reste du document explique comment utiliser les API File System et Sync File System de Google Chrome (voir aussi API fileSystem et API syncFileSystem).
Options de stockage
Les applications empaquetées utilisent de nombreux mécanismes différents pour envoyer et recevoir des données. Pour les données externes (ressources, pages Web), vous devez connaître Content Security Policy (CSP). Semblable à Chrome Les extensions vous permettent de communiquer avec les serveurs distants à l'aide de XMLHttpRequests d'origine croisée. Toi peut également isoler les pages externes, de sorte que le reste de votre application soit sécurisé (voir la section Intégrer un .
Lorsque vous enregistrez des données localement, vous pouvez utiliser l'API Chrome Storage pour enregistrer de petites quantités de chaînes et IndexedDB pour enregistrer les données structurées. Avec IndexedDB, vous pouvez conserver les objets JavaScript et utiliser ses index pour interroger des données. Pour en savoir plus, consultez la page Simple Todo de HTML5 Rock Répertorier les tutoriels). Pour tous les autres types de données, comme les données binaires, utilisez le système de fichiers et la synchronisation. API Filesystem.
Les API FileSystem et Sync Filesystem de Chrome étendent l'API FileSystem HTML5. Grâce au API Filesystem, les applications peuvent créer, lire, naviguer et écrire dans une section en bac à sable du système de fichiers local. Par exemple, une application de partage de photos peut utiliser l'API Filesystem pour lire et écrire toute des photos sélectionnées par l'utilisateur.
Avec l'API Sync Filesystem de Chrome, les applications peuvent enregistrer et synchroniser des données dans le Google Drive d'un utilisateur pour que les mêmes données peuvent être disponibles sur différents clients. Par exemple, un texte sauvegardé dans le cloud de texte peut synchroniser automatiquement les nouveaux fichiers texte avec le compte Google Drive d'un utilisateur. Lorsque utilisateur ouvre l'éditeur de texte dans un nouveau client, Google Drive transfère les nouveaux fichiers texte vers cette instance de l'éditeur de texte.
Utiliser l'API Chrome Filesystem
Ajouter une autorisation de système de fichiers
Pour utiliser l'API File System de Chrome, vous devez ajouter "fileSystem" l'autorisation d'accès au fichier manifeste, que vous pouvez obtenir l’autorisation de l’utilisateur pour stocker des données persistantes.
"permissions": [
"...",
"fileSystem"
]
Options utilisateur pour la sélection des fichiers
Les utilisateurs s'attendent à sélectionner des fichiers comme ils le font toujours. Ils s'attendent au minimum à obtenir fichier" et un sélecteur de fichier standard. Si votre application fait une utilisation intensive de la gestion des fichiers, vous devez également Implémentez le glisser-déposer (voir ci-dessous et consultez également l'article Glisser-déposer HTML5 natif).
Obtenir le chemin d'accès à un fileEntry
Pour obtenir le chemin d'accès complet du fichier sélectionné par l'utilisateur, fileEntry
, appelez getDisplayPath()
:
function displayPath(fileEntry) {
chrome.fileSystem.getDisplayPath(fileEntry, function(path) {
console.log(path)
});
}
Implémenter le glisser-déposer
Si vous devez implémenter la sélection par glisser-déposer, le contrôleur de fichiers par glisser-déposer (dnd.js
) se trouve dans
l'exemple filesystem-access est un bon point de départ. Le contrôleur crée une entrée de fichier
à partir d'un DataTransferItem
par glisser-déposer. Dans cet exemple, fileEntry
est défini sur la première
élément supprimé.
var dnd = new DnDFileController('body', function(data) {
var fileEntry = data.items[0].webkitGetAsEntry();
displayPath(fileEntry);
});
Lire un fichier
Le code suivant ouvre le fichier (en lecture seule) et le lit comme du texte à l'aide d'un objet FileReader
. Si
le fichier n'existe pas, une erreur est générée.
var chosenFileEntry = null;
chooseFileButton.addEventListener('click', function(e) {
chrome.fileSystem.chooseEntry({type: 'openFile'}, function(readOnlyEntry) {
readOnlyEntry.file(function(file) {
var reader = new FileReader();
reader.onerror = errorHandler;
reader.onloadend = function(e) {
console.log(e.target.result);
};
reader.readAsText(file);
});
});
});
Écrire un fichier
Les deux cas d'utilisation courants
de l'écriture d'un fichier sont « Enregistrer » et "Enregistrer sous". Le code suivant crée un
writableEntry
à partir de chosenFileEntry
en lecture seule et y écrit le fichier sélectionné.
chrome.fileSystem.getWritableEntry(chosenFileEntry, function(writableFileEntry) {
writableFileEntry.createWriter(function(writer) {
writer.onerror = errorHandler;
writer.onwriteend = callback;
chosenFileEntry.file(function(file) {
writer.write(file);
});
}, errorHandler);
});
Le code suivant crée un fichier avec "Enregistrer sous" et écrit le nouvel blob
à l'aide de la méthode writer.write()
.
chrome.fileSystem.chooseEntry({type: 'saveFile'}, function(writableFileEntry) {
writableFileEntry.createWriter(function(writer) {
writer.onerror = errorHandler;
writer.onwriteend = function(e) {
console.log('write complete');
};
writer.write(new Blob(['1234567890'], {type: 'text/plain'}));
}, errorHandler);
});
Utiliser l'API Chrome Sync Filesystem
Grâce au stockage de fichiers synchronisable, les objets de données renvoyés peuvent être utilisés de la même manière que les objets des systèmes de fichiers hors connexion dans l'API FileSystem, mais avec la synchronisation supplémentaire (et automatique) de ces vers Google Drive.
Ajouter une autorisation d'accès au système de fichiers de synchronisation
Pour utiliser l'API Sync Filesystem de Chrome, vous devez ajouter "syncFileSystem" l'autorisation manifeste, afin que vous puissiez obtenir l'autorisation de l'utilisateur pour stocker et synchroniser des données persistantes.
"permissions": [
"...",
"syncFileSystem"
]
Lancement du stockage de fichiers synchronisables...
Pour activer le stockage de fichiers synchronisable dans votre application, il vous suffit d'appeler syncFileSystem.requestFileSystem. Cette méthode renvoie un système de fichiers pouvant être synchronisé et sauvegardé par Google Drive, par exemple:
chrome.syncFileSystem.requestFileSystem(function (fs) {
// FileSystem API should just work on the returned 'fs'.
fs.root.getFile('test.txt', {create:true}, getEntryCallback, errorCallback);
});
À propos de l'état de synchronisation des fichiers
Utilisez syncFileSystem.getFileStatus pour obtenir l'état de synchronisation d'un fichier actuel:
chrome.syncFileSystem.getFileStatus(entry, function(status) {...});
L'état de synchronisation des fichiers peut avoir l'une des valeurs suivantes: 'synced'
, 'pending'
ou 'conflicting'
.
"Synchronisé" signifie que le fichier est entièrement synchronisé ; il n'y a aucune modification locale en attente qui n'a pas été
synchronisé avec Google Drive. Il peut toutefois y avoir des modifications à finaliser dans Google Drive
qui n'ont pas encore été récupérées.
"En attente" signifie que le fichier comporte des modifications à finaliser qui n'ont pas encore été synchronisées dans Google Drive. Si l'application est
s'exécute en ligne, les modifications locales sont (presque) immédiatement synchronisées avec Google Drive
L'événement syncFileSystem.onFileStatusChanged est déclenché avec l'état 'synced'
(voir ci-dessous les
plus de détails).
syncFileSystem.onFileStatusChanged est déclenché lorsque l'état d'un fichier passe à
'conflicting'
'Conflit' signifie qu'il y a des modifications conflictuelles sur le stockage local
Google Drive. Cet état ne peut être attribué à un fichier que si la règle de résolution des conflits est définie sur
'manual'
La règle par défaut est 'last_write_win'
, et les conflits sont automatiquement résolus
de type "dernier écriture-gagnant". La règle de résolution des conflits du système peut être modifiée en
syncFileSystem.setConflictResolutionPolicy.
Si la règle de résolution des conflits est définie sur 'manual'
et qu'un fichier présente l'état 'conflicting'
,
L'application peut toujours lire et écrire le fichier en tant que fichier hors connexion local, mais les modifications ne sont pas synchronisées
et le fichier restera dissocié des modifications à distance apportées sur d'autres clients jusqu'à ce que le conflit soit
résolu. Le moyen le plus simple de résoudre un conflit consiste à supprimer ou à renommer la version locale du fichier.
Cela force la synchronisation de la version distante, l'état en conflit est résolu et
L'événement onFileStatusChanged
est déclenché avec l'état 'synced'
.
Écouter les modifications de l'état de synchronisation
L'événement syncFileSystem.onFileStatusChanged est déclenché lorsque l'état de synchronisation d'un fichier change.
Par exemple, supposons qu'un fichier comporte des modifications à finaliser et qu'il se trouve dans l'état de l'état. L'application a peut-être été
en état hors connexion afin que le changement
soit sur le point d'être synchronisé. Lorsque le service de synchronisation détecte la
modification locale en attente et importe la modification dans Google Drive, le service déclenche le
Événement onFileStatusChanged
avec les valeurs suivantes:
{ fileEntry:a fileEntry for the file, status: 'synced', action: 'updated', direction: 'local_to_remote' }
De même, quelles que soient les activités locales, le service de synchronisation peut détecter des modifications distantes apportées par
et télécharge les modifications depuis Google Drive vers le stockage local. Si la télécommande
la modification apportée à l'ajout d'un nouveau fichier, un événement avec les valeurs suivantes est déclenché:
{ fileEntry: a fileEntry for the file, status: 'synced', action: 'added', direction: 'remote_to_local' }
Si des modifications sont en conflit pour le même fichier côté local et côté distant, et si le conflit
la règle de résolution est définie sur 'manual'
, l'état du fichier passe à l'état conflicting
, est
est dissocié du service de synchronisation et ne sera pas synchronisé tant que le conflit n'aura pas été résolu. Dans ce
cas où un événement avec les valeurs suivantes est déclenché:
{ fileEntry: a fileEntry for the file, status: 'conflicting', action: null, direction: null }
Pour cet événement, vous pouvez ajouter un écouteur qui répond aux changements d'état. Par exemple, L'application Lecteur de musique Chrome écoute toute nouvelle musique synchronisée depuis Google Drive, mais pas encore importés dans le stockage local de l'utilisateur sur un client particulier. Toute la musique trouvée y est synchronisée. client:
chrome.syncFileSystem.onFileStatusChanged.addListener(function(fileInfo) {
if (fileInfo.status === 'synced') {
if (fileInfo.direction === 'remote_to_local') {
if (fileInfo.action === 'added') {
db.add(fileInfo.fileEntry);
} else if (fileInfo.action === 'deleted') {
db.remove(fileInfo.fileEntry);
}
}
}
});
Vérifier l'utilisation de l'API
Pour vérifier la quantité de données utilisées par l'API, interrogez le répertoire de bac à sable local de l'application ou la Nombre d'octets d'utilisation renvoyés par syncFileSystem.getUsageAndQuota:
chrome.syncFileSystem.getUsageAndQuota(fileSystem, function (storageInfo) {
updateUsageInfo(storageInfo.usageBytes);
updateQuotaInfo(storageInfo.quotaBytes);
});
Vous pouvez également consulter l'espace de stockage du service de backend de synchronisation de l'utilisateur (dans Google Drive). Les fichiers synchronisés sont enregistré dans un dossier Google Drive masqué, Chrome Syncable FileSystem. Le dossier ne s'affichera pas dans votre dossier "Mon Drive" , mais vous pouvez y accéder en recherchant le nom du dossier dans le champ de recherche. Notez que il n'est pas garanti que la mise en page du dossier distant reste rétrocompatible entre les versions.)