Registra un'app come gestore di file con il 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 app web come gestori dei file che le loro app possono creare ed elaborare. L'API File Handling ti 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
Potenziamento progressivo
L'API File Handling non può essere polyfilled. Tuttavia, la funzionalità di apertura dei file con un'app web può essere ottenuta in altri due modi:
- 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 di funzionalità
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 loro manifest dell'app web
quale tipo di file 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 aprire più file in un singolo client o in più client. Il valore predefinito è"single-client"
. Se l'utente apre più file e 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.
}
});
}
Supporto 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 crei un file con questo strumento e lo memorizzi da qualche parte nel tuo sistema di file, puoi aprirlo facendo doppio clic o con il tasto destro del mouse e selezionando "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 in Controllo dell'accesso a potenti funzionalità della piattaforma web, tra cui il controllo utente, la trasparenza e l'ergonomia.
Autorizzazioni, persistenza delle autorizzazioni e aggiornamenti dei gestori dei file
Per garantire la fiducia degli utenti e la sicurezza dei loro file, quando l'API di gestione dei file apre un file, viene visualizzata 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 vasta categoria di vettori di attacco che vengono aperti consentendo ai siti web di accedere ai file. Questi sono descritti nell'articolo sull'API File System Access. La funzionalità aggiuntiva pertinente alla sicurezza fornita dall'API File Handling rispetto all'API Accesso al file system è la possibilità di concedere l'accesso a determinati file tramite l'UI integrata del sistema operativo, anziché tramite un selettore di 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 quel tipo di file in modo silenzioso e senza alcun intervento da parte dell'utente. Ciò significa che se l'utente fa doppio clic su un file di questo tipo, si aprirà automaticamente nell'app web registrata. Su questi sistemi operativi host, quando l'agente utente determina che non esiste un gestore predefinito per il tipo di file, potrebbe essere necessaria una richiesta di autorizzazione esplicita per evitare di inviare accidentalmente i contenuti di un file a un'applicazione web senza il consenso dell'utente.
Controllo utente
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 usurpare 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 associazioni di file esistenti. 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 domande o commenti sul modello di sicurezza?
- Invia una segnalazione relativa alle specifiche nel repository GitHub corrispondente o aggiungi le tue considerazioni a un problema 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 all'indirizzo @ChromiumDev utilizzando l'hashtag
#FileHandling
e facci sapere dove e come lo stai utilizzando.
Link utili
- Spiegazione pubblica
- 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.