Cómo la app de edición de imágenes Photopea usa la API de File Handling para permitir que los usuarios abran archivos desde su explorador

La API de File Handling permite que las aplicaciones web se registren como un controlador de archivos para los formatos de archivo que la aplicación puede admitir. Obtén información sobre cómo la aplicación de edición de imágenes Photopea usa esta API.

Introducción

(Este artículo también está disponible en forma de video).

Photopea es un editor de imágenes en línea gratuito desarrollado por Ivan Kutskir. Ivan comenzó a trabajar en la app en 2012 y mantiene un blog en el que comparte las funciones principales que agrega a Photopea. Photopea puede trabajar con los formatos PSD (Adobe Photoshop), XCF (GIMP), Sketch (app de Sketch), XD (Adobe XD) y CDR (CorelDRAW).

La app de Photopea

Manejo de archivos en Photopea

Como AWP instalable, Photopea se ejecuta en una ventana independiente cuando el usuario elige instalar la app. De esta manera, se desbloquea un superpoder de las AWP, del que Photopea hace un gran uso: el manejo de archivos.

La parte declarativa de la API de File Handling

Después de la instalación, Photopea se registra como un controlador de archivos con el sistema operativo para los diferentes formatos de archivo que admite. Esto se hace en el manifiesto de aplicación web, agregando el campo file_handlers. Cada tipo de archivo admitido es un objeto, action tiene una URL relativa como valor y el objeto accept es un mapa de tipos de MIME y extensiones de archivo asociadas. Por ejemplo, {"image/jpeg": [".jpeg", ".jpg"]}. El siguiente código es el manifiesto de la app web de Photopea de producción, con las 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"]
            }
          ]
        }
    }
}

El Finder de macOS con el usuario haciendo clic con el botón derecho en un archivo y, luego, seleccionando "Abrir con" Photopea.

La parte imperativa de la API de File Handling

Luego, la parte imperativa de la API se ocupa de controlar los archivos que el sistema operativo pasa a la AWP. El código de Photopea está muy minimizado y deslucido, pero, de todos modos, la esencia del siguiente fragmento no es tan difícil de entender. La interfaz LaunchQueue (minificada como N) tiene un método setConsumer(), que acepta una función como argumento. Esta función, a su vez, toma un objeto LaunchParams (minificado como W) . Este objeto LaunchParams tiene una propiedad files que apunta a un array de solo lectura de objetos FileSystemHandle, que el resto del código luego itera y, para cada uno, obtiene el objeto File (reducido como G) llamando a getFile(). Luego, este archivo se pasa a otra lógica en Photopea que se encarga de mostrarlo.

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]);
      });
    }
  });
}

Conclusiones

Los usuarios llevan mucho tiempo pidiendo que Photopea se convierta en un controlador de archivos de imágenes. En 2020, cuando surgió la pregunta, esta función era completamente impensable, pero un usuario entusiasta descubrió la API de manejo de archivos en sus etapas iniciales a principios de 2022, cuando aún estaba detrás de una marca. El manejo de archivos finalmente se envió en Chrome 102 y se convirtió en una función muy querida de Photopea que los usuarios usan a diario. Algunos incluso la llaman un cambio de juego. Asegúrate de probar Photopea, instálalo en tu computadora y, luego, intenta abrir uno de los formatos de archivo que admite. ¡Que disfrutes editando imágenes!