图片编辑应用 Photopea 如何使用 File Handling API 允许用户从文件资源管理器打开文件

借助 File Handling API,Web 应用可以将自己注册为应用支持的文件格式的文件处理程序。了解图片编辑应用 Photopea 如何使用此 API。

简介

(本文还提供视频形式。)

Photopea 是由 Ivan Kutskir 开发的一款免费在线图片编辑器。Ivan 从 2012 年开始开发这款应用,并维护了一个博客,分享他为 Photopea 添加的主要功能。Photopea 支持 PSD (Adobe Photoshop)、XCF (GIMP)、Sketch (Sketch App)、XD (Adobe XD) 和 CDR (CorelDRAW) 格式。

Photopea 应用。

Photopea 中的文件处理

作为可安装的 PWA,当用户选择安装应用时,Photopea 会在独立窗口中运行。这样一来,Photopea 就可以充分利用 PWA 的强大功能:文件处理

File Handling API 的声明部分

安装后,Photopea 会将自己注册为操作系统的文件处理程序,以处理它支持的不同文件格式。这发生在网络应用清单中,具体方法是添加 file_handlers 字段。每个受支持的文件类型都是一个对象,action 的值为相对网址,accept 对象是 MIME 类型与关联文件扩展名的映射。例如 {"image/jpeg": [".jpeg", ".jpg"]}。以下代码是 Photopea 的正式版 Web 应用清单,其中突出显示了相关部分。

{
    "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"]
            }
          ]
        }
    }
}

macOS 的“访问”窗口,其中显示了用户右键点击某个文件,然后选择“打开方式”>“Photopea”。

File Handling API 的命令式部分

然后,API 的命令式部分会处理操作系统传递给 PWA 的文件。Photopea 的代码显然经过了大量的缩减和美化处理,但下面代码段的要点并不难以理解。LaunchQueue 接口(缩减为 N)具有 setConsumer() 方法,该方法接受函数作为参数。该函数接受 LaunchParams 对象(缩减为 W)。此 LaunchParams 对象有一个 files 属性,指向一个只读 FileSystemHandle 对象数组,然后代码的其余部分会循环遍历该数组,并针对每个对象调用 getFile() 来获取 File 对象(缩减为 G)。然后,此文件会传递给 Photopea 中的其他逻辑,以负责显示文件。

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

总结

用户一直在要求 Photopea 成为图片的文件处理程序。2020 年出现该问题时,我们完全无法想象会有此功能,但在 2022 年初,一位热心的用户发现了文件处理 API 的早期版本,当时该 API 还处于标志后面。文件处理功能最终在 Chrome 102 中发布,成为了用户每天都使用的热门 Photopea 功能,有些用户甚至称其为改变游戏规则的功能。请务必试用一下 Photopea,将其安装在桌面设备上,然后尝试打开它支持的某种文件格式!祝您编辑愉快!