Enregistrez une application en tant que gestionnaire de fichiers auprès du système d'exploitation.
Maintenant que les applications Web sont capables de lire et d'écrire des fichiers, la prochaine étape logique consiste à permettre aux développeurs de déclarer ces applications Web comme gestionnaires de fichiers pour les fichiers que leurs applications peuvent créer et traiter. L'API File Handling vous permet de faire exactement cela. Après avoir enregistré une application d'éditeur de texte en tant que gestionnaire de fichiers et l'avoir installée, vous pouvez effectuer un clic droit sur un fichier .txt sur macOS et sélectionner "Lire les informations" pour indiquer à l'OS qu'il doit toujours ouvrir les fichiers .txt avec cette application par défaut.
Cas d'utilisation suggérés pour l'API File Handling
Voici quelques exemples de sites pouvant utiliser cette API :
- Applications Office telles que les éditeurs de texte, les applications de feuilles de calcul et les créateurs de diaporamas.
- Éditeurs graphiques et outils de dessin.
- Outils d'édition de niveaux de jeux vidéo.
Utiliser l'API File Handling
Amélioration progressive
L'API File Handling en tant que telle ne peut pas être polyfillée. Toutefois, vous pouvez ouvrir des fichiers avec une application Web de deux autres manières :
- L'API Web Share Target permet aux développeurs de spécifier leur application comme cible de partage afin que les fichiers puissent être ouverts à partir de la feuille de partage du système d'exploitation.
- L'API File System Access peut être intégrée au glisser-déposer de fichiers, ce qui permet aux développeurs de gérer les fichiers déposés dans l'application déjà ouverte.
Prise en charge des navigateurs
Détection de fonctionnalités
Pour vérifier si l'API File Handling est compatible, utilisez :
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
// The File Handling API is supported.
}
Partie déclarative de l'API File Handling
Dans un premier temps, les applications Web doivent décrire de manière déclarative dans leur fichier manifeste d'application Web les types de fichiers qu'elles peuvent gérer. L'API File Handling étend le fichier manifeste de l'application Web avec une nouvelle propriété appelée "file_handlers" qui accepte un tableau de gestionnaires de fichiers. Un gestionnaire de fichiers est un objet comportant les propriétés suivantes :
- Propriété
"action"qui pointe vers une URL dans le champ d'application de l'application en tant que valeur. - Propriété
"accept"avec un objet de types MIME comme clés et des listes d'extensions de fichier comme valeurs. - Propriété
"icons"avec un tableau d'icônesImageResource. Certains systèmes d'exploitation permettent à une association de type de fichier d'afficher une icône qui n'est pas seulement l'icône de l'application associée, mais plutôt une icône spéciale liée à l'utilisation de ce type de fichier avec l'application. - Propriété
"launch_type"qui définit si plusieurs fichiers doivent être ouverts dans un seul client ou dans plusieurs clients. La valeur par défaut est"single-client". Si l'utilisateur ouvre plusieurs fichiers et que le gestionnaire de fichiers a été annoté avec"multiple-clients"comme"launch_type", plusieurs lancements d'application se produiront. Pour chaque lancement, le tableauLaunchParams.files(voir plus bas) ne comportera qu'un seul élément.
L'exemple ci-dessous, qui ne montre que l'extrait pertinent du fichier manifeste de l'application Web, devrait vous aider à mieux comprendre :
{
"file_handlers": [
{
"action": "/open-csv",
"accept": {
"text/csv": [".csv"]
},
"icons": [
{
"src": "csv-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "single-client"
},
{
"action": "/open-svg",
"accept": {
"image/svg+xml": ".svg"
},
"icons": [
{
"src": "svg-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "single-client"
},
{
"action": "/open-graf",
"accept": {
"application/vnd.grafr.graph": [".grafr", ".graf"],
"application/vnd.alternative-graph-app.graph": ".graph"
},
"icons": [
{
"src": "graf-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "multiple-clients"
}
]
}
Il s'agit d'une application hypothétique qui gère les fichiers de valeurs séparées par des virgules (.csv) à l'adresse /open-csv, les fichiers de graphiques vectoriels évolutifs (.svg) à l'adresse /open-svg et un format de fichier Grafr fictif avec l'une des extensions .grafr, .graf ou .graph à l'adresse /open-graf. Les deux premiers s'ouvriront dans un seul client, le dernier dans plusieurs clients si plusieurs fichiers sont traités.
Partie impérative de l'API File Handling
Maintenant que l'application a déclaré les fichiers qu'elle peut gérer à l'URL concernée, elle doit impérativement faire quelque chose avec les fichiers entrants en pratique. C'est là que launchQueue entre en jeu. Pour accéder aux fichiers lancés, un site doit spécifier un consommateur pour l'objet window.launchQueue. Les lancements sont mis en file d'attente jusqu'à ce qu'ils soient traités par le consommateur spécifié, qui est appelé exactement une fois pour chaque lancement. De cette manière, chaque lancement est géré, quelle que soit la date à laquelle le consommateur a été spécifié.
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
launchQueue.setConsumer((launchParams) => {
// Nothing to do when the queue is empty.
if (!launchParams.files.length) {
return;
}
for (const fileHandle of launchParams.files) {
// Handle the file.
}
});
}
Prise en charge des outils de développement
Au moment de la rédaction de cet article, les outils de développement ne sont pas pris en charge, mais j'ai déposé une demande de fonctionnalité pour que cette prise en charge soit ajoutée.
Démo
J'ai ajouté la prise en charge de la gestion des fichiers à Excalidraw, une application de dessin de style bande dessinée. Pour la tester, vous devez d'abord installer Excalidraw. Lorsque vous créez un fichier avec et que vous le stockez quelque part dans votre système de fichiers, vous pouvez l'ouvrir en double-cliquant dessus, ou en effectuant un clic droit et en sélectionnant "Excalidraw" dans le menu contextuel. Vous pouvez consulter l'implémentation dans le code source.
.excalidraw.
Sécurité
L'équipe Chrome a conçu et implémenté l'API File Handling en utilisant les principes de base définis dans Controlling Access to Powerful Web Platform Features, y compris le contrôle utilisateur, la transparence et l'ergonomie.
Autorisations, persistance des autorisations et mises à jour du gestionnaire de fichiers
Pour garantir la confiance des utilisateurs et la sécurité de leurs fichiers, lorsqu'une PWA ouvre un fichier à l'aide de l'API File Handling, une invite d'autorisation s'affiche avant qu'elle puisse le consulter. Cette invite d'autorisation s'affichera juste après que l'utilisateur aura sélectionné la PWA pour ouvrir un fichier. L'autorisation est donc étroitement liée à l'action d'ouvrir un fichier à l'aide de la PWA, ce qui la rend plus compréhensible et pertinente.
Cette autorisation s'affichera à chaque fois jusqu'à ce que l'utilisateur clique sur Autoriser ou Bloquer la gestion des fichiers pour le site, ou ignore l'invite trois fois (après quoi Chromium bloquera cette autorisation). Le paramètre sélectionné sera conservé lorsque vous fermerez et rouvrirez la PWA.
Lorsque le fichier manifeste est mis à jour et que des modifications sont détectées dans la section "file_handlers", les autorisations sont réinitialisées.
Problèmes liés aux fichiers
Autoriser les sites Web à accéder aux fichiers ouvre une large catégorie de vecteurs d'attaque. Ces limites sont décrites dans l'article sur l'API File System Access. L'API File Handling offre une fonctionnalité de sécurité supplémentaire par rapport à l'API File System Access : la possibilité d'accorder l'accès à certains fichiers via l'interface utilisateur intégrée du système d'exploitation, au lieu d'utiliser un sélecteur de fichiers affiché par une application Web.
Il existe toujours un risque que les utilisateurs accordent involontairement à une application Web l'accès à un fichier en l'ouvrant. Toutefois, il est généralement admis que l'ouverture d'un fichier permet à l'application avec laquelle il est ouvert de lire et/ou de manipuler ce fichier. Par conséquent, le choix explicite d'un utilisateur d'ouvrir un fichier dans une application installée, par exemple via un menu contextuel "Ouvrir avec…", peut être considéré comme un signal de confiance suffisant dans l'application.
Défis liés au gestionnaire par défaut
La seule exception à cette règle est lorsqu'aucune application n'est disponible sur le système hôte pour un type de fichier donné. Dans ce cas, certains systèmes d'exploitation hôtes peuvent promouvoir automatiquement le gestionnaire nouvellement enregistré en tant que gestionnaire par défaut pour ce type de fichier, de manière silencieuse et sans aucune intervention de l'utilisateur. Cela signifie que si l'utilisateur double-clique sur un fichier de ce type, il s'ouvre automatiquement dans l'application Web enregistrée. Sur ces systèmes d'exploitation hôtes, lorsque l'agent utilisateur détermine qu'il n'existe pas de gestionnaire par défaut pour le type de fichier, une invite d'autorisation explicite peut être nécessaire pour éviter d'envoyer accidentellement le contenu d'un fichier à une application Web sans le consentement de l'utilisateur.
Contrôle des utilisateurs
La spécification indique que les navigateurs ne doivent pas enregistrer tous les sites pouvant gérer des fichiers en tant que gestionnaires de fichiers. L'enregistrement de la gestion des fichiers doit plutôt être limité à l'installation et ne jamais se produire sans confirmation explicite de l'utilisateur, en particulier si un site doit devenir le gestionnaire par défaut. Plutôt que de pirater des extensions existantes comme .json pour lesquelles l'utilisateur a probablement déjà enregistré un gestionnaire par défaut, les sites devraient envisager de créer leurs propres extensions.
Transparence
Tous les systèmes d'exploitation permettent aux utilisateurs de modifier les associations de fichiers actuelles. Cela ne relève pas du navigateur.
Commentaires
L'équipe Chrome souhaite connaître votre avis sur l'API File Handling.
Parlez-nous de la conception de l'API
Y a-t-il quelque chose dans l'API qui ne fonctionne pas comme prévu ? Ou bien manque-t-il des méthodes ou des propriétés dont vous avez besoin pour implémenter votre idée ? Vous avez une question ou un commentaire sur le modèle de sécurité ?
- Signalez un problème lié aux spécifications dans le dépôt GitHub correspondant ou ajoutez vos commentaires à un problème existant.
Signaler un problème d'implémentation
Avez-vous trouvé un bug dans l'implémentation de Chrome ? L'implémentation est-elle différente de la spécification ?
- Signalez un bug sur new.crbug.com. Veillez à inclure autant de détails que possible, des instructions simples pour reproduire le problème et saisissez
UI>Browser>WebAppInstalls>FileHandlingdans la zone Composants.
Soutenir l'API
Prévoyez-vous d'utiliser l'API File Handling ? Votre soutien public aide l'équipe Chrome à hiérarchiser les fonctionnalités et montre aux autres fournisseurs de navigateurs à quel point il est essentiel de les prendre en charge.
- Expliquez comment vous prévoyez de l'utiliser dans le fil de discussion WICG.
- Envoyez un tweet à @ChromiumDev avec le hashtag
#FileHandlingpour nous indiquer où et comment vous l'utilisez.
Liens utiles
- Explication publique
- Démonstration de l'API File Handling | Source de la démonstration de l'API File Handling
- Bug de suivi Chromium
- Entrée ChromeStatus.com
- Composant Blink :
UI>Browser>WebAppInstalls>FileHandling - Examen du TAG
- Position de Mozilla sur les normes
Remerciements
L'API File Handling a été spécifiée par Eric Willigers, Jay Harris et Raymes Khoury. Cet article a été examiné par Joe Medley.