Registreer een app als bestandsafhandelaar bij het besturingssysteem.
Nu webapps bestanden kunnen lezen en schrijven , is de volgende logische stap om ontwikkelaars deze webapps te laten declareren als bestandshandlers voor de bestanden die hun apps kunnen aanmaken en verwerken. De File Handling API maakt dit mogelijk. Nadat u een teksteditor-app als bestandshandler hebt geregistreerd en geïnstalleerd, kunt u met de rechtermuisknop op een .txt
bestand op macOS klikken en 'Info weergeven' selecteren om het besturingssysteem te instrueren dat .txt
bestanden altijd standaard met deze app moeten worden geopend.
Voorgestelde gebruiksscenario's voor de API voor bestandsverwerking
Voorbeelden van sites die deze API kunnen gebruiken zijn:
- Office-toepassingen zoals teksteditors, spreadsheet-apps en tools om diavoorstellingen te maken.
- Grafische editors en tekenhulpmiddelen.
- Hulpmiddelen voor het bewerken van videogamelevels.
Hoe de API voor bestandsverwerking te gebruiken
Progressieve verbetering
De File Handling API kan niet per se worden gepolyfilld. De functionaliteit om bestanden te openen met een webapp kan echter op twee andere manieren worden bereikt:
- Met de Web Share Target API kunnen ontwikkelaars hun app opgeven als een share target, zodat bestanden kunnen worden geopend via het deelvenster van het besturingssysteem.
- De File System Access API kan worden geïntegreerd met het slepen en neerzetten van bestanden, zodat ontwikkelaars neergezette bestanden in de reeds geopende app kunnen verwerken.
Browserondersteuning
Functiedetectie
Om te controleren of de File Handling API wordt ondersteund, gebruikt u:
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
// The File Handling API is supported.
}
Het declaratieve deel van de File Handling API
Als eerste stap moeten webapps in hun webappmanifest declaratief beschrijven welke bestanden ze kunnen verwerken. De File Handling API breidt het webappmanifest uit met een nieuwe eigenschap genaamd "file_handlers"
die een reeks van, nou ja, bestandshandlers accepteert. Een bestandshandler is een object met de volgende eigenschappen:
- Een
"action"
eigenschap die als waarde verwijst naar een URL binnen het bereik van de app. - Een
"accept"
-eigenschap met een object van MIME-typen als sleutels en lijsten met bestandsextensies als hun waarden. - Een
"icons"
-eigenschap met een reeksImageResource
-iconen. Sommige besturingssystemen staan toe dat een bestandstypekoppeling een pictogram weergeeft dat niet alleen het bijbehorende applicatiepictogram is, maar een speciaal pictogram dat gerelateerd is aan het gebruik van dat bestandstype met de applicatie. - Een
"launch_type"
-eigenschap die definieert of meerdere bestanden in één client of in meerdere clients geopend moeten worden. De standaardwaarde is"single-client"
. Als de gebruiker meerdere bestanden opent en de bestandshandler is geannoteerd met"multiple-clients"
als"launch_type"
, zullen er meer dan één app-starts plaatsvinden en zal de arrayLaunchParams.files
(zie verderop ) voor elke start slechts één element bevatten.
Het onderstaande voorbeeld, waarin alleen het relevante fragment uit het web-app-manifest wordt getoond, maakt het duidelijker:
{
"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"
}
]
}
Dit is voor een hypothetische toepassing die komma-gescheiden bestanden ( .csv
) verwerkt in /open-csv
, schaalbare vectorafbeeldingen ( .svg
) in /open-svg
en een zelfgemaakt Grafr-bestandsformaat met .grafr
, .graf
of .graph
als extensie in /open-graf
. De eerste twee worden in één client geopend, de laatste in meerdere clients als er meerdere bestanden worden verwerkt.
Het onmisbare onderdeel van de File Handling API
Nu de app theoretisch heeft aangegeven welke bestanden hij op welke URL binnen het bereik kan verwerken, moet hij in de praktijk absoluut iets met inkomende bestanden doen. Dit is waar de launchQueue
om de hoek komt kijken. Om toegang te krijgen tot gestarte bestanden, moet een site een gebruiker voor het window.launchQueue
-object specificeren. Starts worden in de wachtrij geplaatst totdat ze worden afgehandeld door de opgegeven gebruiker, die precies één keer per start wordt aangeroepen. Op deze manier wordt elke start afgehandeld, ongeacht wanneer de gebruiker is opgegeven.
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.
}
});
}
DevTools-ondersteuning
Op het moment dat ik dit schrijf, is er nog geen DevTools-ondersteuning. Ik heb echter een verzoek ingediend om ondersteuning toe te voegen.
Demonstratie
Ik heb ondersteuning voor bestandsverwerking toegevoegd aan Excalidraw , een tekenapp in cartoonstijl. Om dit te testen, moet je eerst Excalidraw installeren. Wanneer je er vervolgens een bestand mee aanmaakt en het ergens op je bestandssysteem opslaat, kun je het bestand openen door te dubbelklikken of met de rechtermuisknop te klikken en vervolgens 'Excalidraw' te selecteren in het contextmenu. Je kunt de implementatie bekijken in de broncode.


.excalidraw
bestanden.Beveiliging
Het Chrome-team heeft de File Handling API ontworpen en geïmplementeerd op basis van de kernprincipes die zijn gedefinieerd in Controlling Access to Powerful Web Platform Features , waaronder gebruikerscontrole, transparantie en ergonomie.
Machtigingen, machtigingspersistentie en updates van de bestandshandler
Om het vertrouwen van de gebruiker en de veiligheid van gebruikersbestanden te waarborgen, wordt er bij het openen van een bestand door de File Handling API een toestemmingsvraag weergegeven voordat een PWA het bestand kan bekijken. Deze toestemmingsvraag wordt direct weergegeven nadat de gebruiker de PWA selecteert om een bestand te openen. Zo is de toestemming nauw verbonden met het openen van een bestand met de PWA, wat het begrijpelijker en relevanter maakt.
Deze toestemming wordt elke keer weergegeven totdat de gebruiker op Toestaan of Blokkeren klikt om bestandsverwerking voor de site toe te staan, of de prompt drie keer negeert (waarna Chromium deze toestemming blokkeert). De geselecteerde instelling blijft behouden, zelfs bij het sluiten en opnieuw openen van de PWA.
Wanneer er manifestupdates en wijzigingen in de sectie "file_handlers"
worden gedetecteerd, worden de machtigingen opnieuw ingesteld.
Bestandsgerelateerde uitdagingen
Er is een grote categorie aanvalsvectoren die worden geopend door websites toegang te geven tot bestanden. Deze worden beschreven in het artikel over de File System Access API . De extra beveiligingsfunctionaliteit die de File Handling API biedt ten opzichte van de File System Access API, is de mogelijkheid om toegang te verlenen tot bepaalde bestanden via de ingebouwde gebruikersinterface van het besturingssysteem, in plaats van via een bestandskiezer die wordt weergegeven door een webapplicatie.
Er bestaat nog steeds een risico dat gebruikers een webapplicatie onbedoeld toegang verlenen tot een bestand door het te openen. Het is echter algemeen bekend dat het openen van een bestand de applicatie waarmee het geopend is, in staat stelt dat bestand te lezen en/of te bewerken. Daarom kan de expliciete keuze van een gebruiker om een bestand te openen in een geïnstalleerde applicatie, bijvoorbeeld via het contextmenu "Openen met...", worden geïnterpreteerd als een voldoende signaal van vertrouwen in de applicatie.
Standaard handler-uitdagingen
De uitzondering hierop is wanneer er geen applicaties op het hostsysteem zijn voor een bepaald bestandstype. In dat geval kunnen sommige hostbesturingssystemen de nieuw geregistreerde handler automatisch, stilzwijgend en zonder tussenkomst van de gebruiker, promoveren tot de standaardhandler voor dat bestandstype. Dit betekent dat als de gebruiker dubbelklikt op een bestand van dat type, het automatisch wordt geopend in de geregistreerde webapp. Op dergelijke hostbesturingssystemen kan een expliciete toestemmingsvraag nodig zijn wanneer de user agent vaststelt dat er geen standaardhandler voor het bestandstype bestaat, om te voorkomen dat de inhoud van een bestand per ongeluk naar een webapp wordt verzonden zonder toestemming van de gebruiker.
Gebruikerscontrole
De specificatie stelt dat browsers niet elke website die bestanden kan verwerken als bestandshandler moeten registreren. In plaats daarvan moet de registratie van bestandsverwerking achter de installatie worden geplaatst en nooit plaatsvinden zonder expliciete toestemming van de gebruiker, vooral niet als een website de standaardhandler moet worden. In plaats van bestaande extensies zoals .json
te kapen, waarvoor de gebruiker waarschijnlijk al een standaardhandler heeft geregistreerd, zouden websites moeten overwegen hun eigen extensies te maken.
Transparantie
Alle besturingssystemen staan gebruikers toe de huidige bestandskoppelingen te wijzigen. Dit valt buiten het bereik van de browser.
Feedback
Het Chrome-team wil graag uw ervaringen met de File Handling API horen.
Vertel ons over het API-ontwerp
Werkt er iets aan de API dat niet werkt zoals u had verwacht? Of ontbreken er methoden of eigenschappen die u nodig hebt om uw idee te implementeren? Heeft u een vraag of opmerking over het beveiligingsmodel?
- Dien een spec-probleem in op de bijbehorende GitHub-repository of voeg uw mening toe over een bestaand probleem.
Meld een probleem met de implementatie
Heb je een bug gevonden in de implementatie van Chrome? Of wijkt de implementatie af van de specificatie?
- Meld een bug op new.crbug.com . Zorg ervoor dat u zoveel mogelijk details en eenvoudige instructies voor reproductie opneemt en typ
UI>Browser>WebAppInstalls>FileHandling
in het vak Componenten .
Toon ondersteuning voor de API
Bent u van plan de File Handling API te gebruiken? Uw publieke steun helpt het Chrome-team om functies te prioriteren en laat andere browserleveranciers zien hoe belangrijk het is om deze te ondersteunen.
- Deel hoe u van plan bent het te gebruiken in de WICG Discourse-thread .
- Stuur een tweet naar @ChromiumDev met de hashtag
#FileHandling
en laat ons weten waar en hoe je het gebruikt.
Nuttige links
- Publieke uitleg
- Demo van de API voor bestandsverwerking | Bron voor demo van de API voor bestandsverwerking
- Chromium-trackingbug
- ChromeStatus.com-vermelding
- Blink-component:
UI>Browser>WebAppInstalls>FileHandling
- TAG-recensie
- Mozilla-standaardpositie
Dankbetuigingen
De File Handling API is gespecificeerd door Eric Willigers , Jay Harris en Raymes Khoury . Dit artikel is beoordeeld door Joe Medley .