Registra un'app come gestore di file nel sistema operativo.
Ora che le app web sono in grado di leggere e scrivere file, il passaggio logico successivo
è consentire agli sviluppatori di dichiarare queste stesse app web come gestori di file per i file che le loro app possono
creare ed elaborare. L'API File handling consente di fare esattamente questo. Dopo aver registrato un'app di editor di testo come gestore di file e averla installata, puoi fare clic con il tasto destro del mouse su un file .txt
su macOS e selezionare "Ottieni informazioni" per poi indicare al sistema operativo di aprire sempre i file .txt
con questa app per impostazione predefinita.
Casi d'uso suggeriti per l'API File Handling
Ecco alcuni esempi di siti che potrebbero utilizzare questa API:
- Applicazioni di Office come editor di testo, app di fogli di lavoro e creator di presentazioni.
- Editor di grafica e strumenti di disegno.
- Strumenti di editor di livelli di videogiochi.
Come utilizzare l'API File handling
Miglioramento progressivo
L'API File Handling non può essere polyfilled. La funzionalità di apertura di file con un'app web, ma può essere ottenuta con altri due mezzi:
- L'API Target di condivisione web consente agli sviluppatori di specificare la propria app come target di condivisione, in modo che i file possano essere aperti dal foglio di condivisione del sistema operativo.
- L'API File System Access può essere integrata con il trascinamento dei file, in modo che gli sviluppatori possano gestire i file trascinati nell'app già aperta.
Supporto browser
Rilevamento delle caratteristiche
Per verificare se l'API File Handling è supportata, utilizza:
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
// The File Handling API is supported.
}
La parte dichiarativa dell'API File Handling
Come primo passaggio, le app web devono descrivere in modo dichiarativo nel file manifest dell'app web
il tipo di file che possono gestire. L'API File Handling estende il file manifest dell'app web con una nuova proprietà chiamata "file_handlers"
che accetta un array di gestori di file. Un gestore file è un oggetto con le seguenti proprietà:
- Una proprietà
"action"
che punta a un URL nell'ambito dell'app come valore. - Una proprietà
"accept"
con un oggetto di tipi MIME come chiavi ed elenchi di estensioni di file come valori. - Una proprietà
"icons"
con un array di iconeImageResource
. Alcuni sistemi operativi consentono a un'associazione di tipo di file di visualizzare un'icona non solo l'icona dell'applicazione associata, ma piuttosto un'icona speciale correlata all'utilizzo di quel tipo di file con l'applicazione. - Una proprietà
"launch_type"
che definisce se più file devono essere aperti in un solo client o in più client. Il valore predefinito è"single-client"
. Se l'utente apre più file e se il gestore dei file è stato annotato con"multiple-clients"
come"launch_type"
, verrà eseguito più di un avvio dell'app e per ogni avvio, l'arrayLaunchParams.files
(vedi di seguito) avrà un solo elemento.
L'esempio seguente, che mostra solo l'estratto pertinente del file manifest dell'app web, dovrebbe chiarire ulteriormente la questione:
{
"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"
}
]
}
Si tratta di un'applicazione ipotetica che gestisce file con valori separati da virgola (.csv
) in /open-csv
, file di grafica vettoriale scalabile (.svg
) in /open-svg
e un formato file Grafr inventato con estensione .grafr
, .graf
o .graph
in /open-graf
. I primi due si apriranno
in un singolo client, l'ultimo in più client se vengono gestiti più file.
La parte imperativa dell'API File Handling
Ora che l'app ha dichiarato in teoria quali file può gestire e in quale URL ambito, deve obbligatoriamente fare qualcosa con i file in arrivo nella pratica. È qui che entra in gioco launchQueue
. Per accedere ai file lanciati, un sito deve specificare un consumatore per l'oggetto window.launchQueue
. I lanci vengono messi in coda fino a quando non vengono gestiti dal consumatore specificato, che viene invocato esattamente una volta per ogni lancio. In questo modo, ogni lancio viene gestito, indipendentemente dal momento in cui è stato specificato il consumatore.
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.
}
});
}
Assistenza di DevTools
Al momento della stesura di questo articolo, non è previsto il supporto di DevTools, ma ho inviato una richiesta di funzionalità per chiedere di aggiungerlo.
Demo
Ho aggiunto il supporto per la gestione dei file a Excalidraw, un'app di disegno in stile cartone animato. Per provarlo, devi prima installare Excalidraw. Quando in seguito crei un file con questo file e lo archivi in un punto del tuo file system, puoi aprirlo con un doppio clic o con un clic con il tasto destro del mouse e poi selezionare "Excalidraw" nel menu contestuale. Puoi controllare l'implementazione nel codice sorgente.
Sicurezza
Il team di Chrome ha progettato e implementato l'API File handling utilizzando i principi fondamentali definiti nella sezione Controllo dell'accesso a funzionalità avanzate della piattaforma web, tra cui controllo degli utenti, trasparenza ed ergonomia.
Autorizzazioni, persistenza delle autorizzazioni e aggiornamenti dei gestori dei file
Per garantire la fiducia degli utenti e la sicurezza dei file degli utenti, quando l'API File handling apre un file, verrà mostrata una richiesta di autorizzazione prima che una PWA possa visualizzare un file. Questa richiesta di autorizzazione viene visualizzata subito dopo che l'utente seleziona la PWA per aprire un file, in modo che l'autorizzazione sia strettamente associata all'azione di apertura di un file utilizzando la PWA, rendendola più comprensibile e pertinente.
Questa autorizzazione verrà visualizzata ogni volta finché l'utente non fa clic su Consenti o Blocca per la gestione dei file per il sito oppure ignora la richiesta tre volte (dopodiché Chromium eseguirà l'embargo e bloccherà questa autorizzazione). L'impostazione selezionata verrà mantenuta dopo la chiusura e la riapertura della PWA.
Quando vengono rilevati gli aggiornamenti e le modifiche del file manifest nella sezione "file_handlers"
, le autorizzazioni vengono reimpostate.
Problemi relativi ai file
Esiste una grande categoria di vettori di attacco che si aprono consentendo ai siti web di accedere ai file. Sono descritti nell'articolo sull'API File System Access. La funzionalità aggiuntiva pertinente per la sicurezza che l'API File handling fornisce sull'API File System Access è la possibilità di concedere l'accesso a determinati file tramite l'interfaccia utente integrata del sistema operativo, anziché tramite un selettore file mostrato da un'applicazione web.
Esiste comunque il rischio che gli utenti possano concedere involontariamente a un'applicazione web l'accesso a un file aprendolo. Tuttavia, è generalmente inteso che l'apertura di un file consente all'applicazione con cui viene aperto di leggere e/o manipolare quel file. Pertanto, la scelta esplicita di un utente di aprire un file in un'applicazione installata, ad esempio tramite un menu contestuale "Apri con…", può essere considerata un'indicazione sufficiente di attendibilità dell'applicazione.
Verifiche per il gestore predefinito
L'eccezione è rappresentata dal caso in cui non siano presenti applicazioni sul sistema host per un determinato tipo di file. In questo caso, alcuni sistemi operativi host potrebbero promuovere automaticamente il gestore appena registrato a gestore predefinito per il tipo di file in questione, in modo invisibile e senza alcun intervento da parte dell'utente. Ciò significa che se l'utente fa doppio clic su un file di quel tipo, questo viene aperto automaticamente nell'app web registrata. Su questi sistemi operativi host, quando lo user agent stabilisce che non esiste un gestore predefinito per il tipo di file, potrebbe essere necessaria una richiesta di autorizzazione esplicita per evitare di inviare inavvertitamente i contenuti di un file a un'applicazione web senza il consenso dell'utente.
Controllo utenti
La specifica prevede che i browser non debbano registrare come gestori di file tutti i siti in grado di gestire file. La registrazione della gestione dei file deve invece essere subordinata all'installazione e non deve mai avvenire senza la conferma esplicita dell'utente, in particolare se un sito deve diventare il gestore predefinito. Invece di compromettere estensioni esistenti come .json
per le quali l'utente ha probabilmente già registrato un gestore predefinito, i siti dovrebbero prendere in considerazione la creazione di estensioni proprie.
Trasparenza
Tutti i sistemi operativi consentono agli utenti di modificare le attuali associazioni di file. Questo non rientra nell'ambito del browser.
Feedback
Il team di Chrome vuole conoscere la tua esperienza con l'API di gestione dei file.
Fornisci informazioni sul design dell'API
C'è qualcosa nell'API che non funziona come previsto? Oppure mancano metodi o proprietà di cui hai bisogno per implementare la tua idea? Hai una domanda o un commento sul modello di sicurezza?
- Invia una segnalazione relativa alle specifiche nel repository GitHub corrispondente o aggiungi il tuo parere a una segnalazione esistente.
Segnalare un problema con l'implementazione
Hai trovato un bug nell'implementazione di Chrome? Oppure l'implementazione è diversa dalla specifica?
- Invia un bug all'indirizzo new.crbug.com. Assicurati di includere il maggior numero di dettagli possibile, istruzioni semplici per la riproduzione e inserisci
UI>Browser>WebAppInstalls>FileHandling
nella casella Componenti. Glitch è ideale per condividere repliche rapide e facili.
Mostra il supporto per l'API
Intendi utilizzare l'API File Handling? Il tuo supporto pubblico aiuta il team di Chrome a dare la priorità alle funzionalità e mostra ad altri fornitori di browser quanto sia fondamentale supportarle.
- Spiega come prevedi di utilizzarlo nel thread di Discourse del WICG.
- Invia un tweet a @ChromiumDev utilizzando l'hashtag
#FileHandling
e facci sapere dove e come lo utilizzi.
Link utili
- Messaggio esplicativo pubblico
- Demo dell'API File Handling | File Handling API demo source
- Bug di monitoraggio di Chromium
- Voce di ChromeStatus.com
- Componente lampeggiante:
UI>Browser>WebAppInstalls>FileHandling
- Revisione del TAG
- Posizione di Mozilla in merito agli standard
Ringraziamenti
L'API File Handling è stata specificata da Eric Willigers, Jay Harris e Raymes Khoury. Questo articolo è stato esaminato da Joe Medley.