A API File Handling permite que os aplicativos da Web se registrem como um gerenciador de arquivos para formatos com suporte. Saiba como o aplicativo de edição de imagens Photopea usa essa API.
Introdução
Este artigo também está disponível em formato de vídeo.
O Photopea é um editor de imagens on-line sem custo financeiro desenvolvido por Ivan Kutskir. Ivan começou a trabalhar no app em 2012 e mantém um blog compartilhando os principais recursos que ele adiciona ao Photopea. O Photopea pode funcionar com os formatos PSD (Adobe Photoshop), XCF (GIMP), Sketch (aplicativo Sketch), XD (Adobe XD) e CDR (CorelDRAW).
Processamento de arquivos no Photopea
Como um PWA instalável, o Photopea é executado em uma janela independente quando o usuário escolhe instalar o app. Isso desbloqueia um superpoder do PWA, que o Photopea usa bastante: processamento de arquivos.
A parte declarativa da API File Handling
Após a instalação, o Photopea se registra como um gerenciador de arquivos com o sistema operacional para os diferentes formatos de arquivo compatíveis. Isso acontece no Manifesto do app da Web, adicionando o campo file_handlers
. Cada tipo de arquivo aceito é um objeto, o action
tem um URL relativo como valor, o objeto accept
, um mapa de tipos MIME e extensões de arquivo associadas. Exemplo: {"image/jpeg": [".jpeg", ".jpg"]}
. O código a seguir é o manifesto do app da Web de produção do Photopea, com as partes relevantes destacadas.
{
"name": "Photopea",
"short_name": "Photopea",
"display": "standalone",
"icons": [
{ "src": "promo/icon512.png", "type": "image/png", "sizes": "512x512" },
{ "src": "promo/maskable512.png", "type": "image/png", "sizes": "512x512", "purpose":"maskable" }
],
"start_url": "/?utm_source=homescreen",
"background_color":"#0f171d",
"theme_color": "#474747",
"file_handlers": [
{ "action": "/", "accept": { "image/psd" : [ ".psd" ] } },
{ "action": "/", "accept": { "image/jpeg": [ ".jpeg", ".jpg" ] } },
{ "action": "/", "accept": { "image/png" : [ ".png" ] } },
{ "action": "/", "accept": { "image/webp": [ ".webp" ] } },
{ "action": "/", "accept": { "image/bmp" : [ ".bmp" ] } },
{ "action": "/", "accept": { "image/gif" : [ ".gif" ] } },
{ "action": "/", "accept": { "image/svg+xml": [ ".svg" ] } },
{ "action": "/", "accept": { "image/pdf" : [ ".pdf" ] } },
{ "action": "/", "accept": { "image/tiff": [ ".tif", ".tiff" ] } },
{ "action": "/", "accept": { "image/ai" : [ ".ai" ] } },
{ "action": "/", "accept": { "image/psb": [ ".psb" ] } },
{ "action": "/", "accept": { "image/xcf": [ ".xcf" ] } },
{ "action": "/", "accept": { "image/sketch": [ ".sketch" ] } },
{ "action": "/", "accept": { "image/xd" : [ ".xd" ] } },
{ "action": "/", "accept": { "image/pxd": [ ".pxd" ] } },
{ "action": "/", "accept": { "image/cdr": [ ".cdr" ] } },
{ "action": "/", "accept": { "image/eps": [ ".eps", ".ps" ] } },
{ "action": "/", "accept": { "image/x-icon": [ ".ico" ] } },
{ "action": "/", "accept": { "image/jpx": [ ".jpx" ] } },
{ "action": "/", "accept": { "image/jp2": [ ".jp2" ] } },
{ "action": "/", "accept": { "image/x-tga": [ ".tga" ] } },
{ "action": "/", "accept": { "image/vnd-ms.dds": [ ".dds" ] } }
],
"share_target": {
"action": "/",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"files": [
{
"name": "image",
"accept": ["image/jpeg", "image/png", "image/webp", "image/gif"]
}
]
}
}
}
A parte imperativa da API File Handling
A parte essencial da API lida com o processamento dos arquivos que o sistema operacional transmite para o PWA. O código do Photopea é obviamente muito minimizado e feio, mas o resumo do snippet abaixo não é tão difícil de entender. A interface LaunchQueue
(minimizada como N
) tem um método setConsumer()
, que aceita uma função como argumento. Essa função, por sua vez, usa um objeto LaunchParams
(minimizado como W
) . Esse objeto LaunchParams
tem uma propriedade files
que aponta para uma matriz somente leitura de objetos FileSystemHandle
, que o restante do código percorre e, para cada um, recebe o objeto File
(minificado como G
) chamando getFile()
. Esse arquivo é transmitido para outra lógica no Photopea que cuida da exibição do arquivo.
var N = window.launchQueue;
if (N) {
var $ = this.UA;
N.setConsumer(function (W) {
var O = W.files;
console.log(O);
for (var Y = 0; Y < O.length; Y++) {
var T = O[Y];
T.getFile().then(function (G) {
$.YO([G], null, null, null, [T]);
});
}
});
}
Conclusões
Os usuários estão pedindo há muito tempo que o Photopea se torne um gerenciador de arquivos para imagens. Em 2020, quando a pergunta apareceu, esse recurso era completamente impensável, mas um usuário ansioso descobriu a API de processamento de arquivos nos estágios iniciais no início de 2022, quando ela ainda estava atrás de uma flag. O gerenciamento de arquivos acabou sendo enviado no Chrome 102 e tem sido um recurso adorado do Photopea usado diariamente pelos usuários, alguns até chamando-o de divisor de águas (link em inglês). Teste o Photopea, instale-o no computador e tente abrir um dos formatos de arquivo compatíveis. Boa edição de imagens!