在 Progressive Web App 中使用系统应用程序打开文件

Open file with system application in a Progressive Web App

我正在尝试弄清楚是否可以使用默认系统应用程序从渐进式 Web 应用程序打开文件。

这个想法是 PWA 将存储一些文件(例如 .docx 文件)以供离线使用,并且用户无需(重新)下载它们就可以打开它们。

理想情况是 PWA 能够将文件加载到内存中,使其可供该文件类型的默认系统应用程序访问(例如 .docx 文件的 Word),观察更改(即用户保存编辑),然后将其存储回 PWA 存储。即使是只读解决方案也很棒。

由于隐含着严重的安全问题,而且 Google 搜索没有任何结果,我最好的选择是(目前)还不支持它。但是,我希望可能有一种我不知道的方法可以做到这一点,并且不需要用户下载文件的副本。

不,PWA 无法侦听常规文件系统更改,除了沙盒化到应用程序本身的文件(这就像安装的每个 PWA 的虚拟文件系统)

您可以参考 only event listener for storage change here,它仅适用于您从 PWA 存储到您的 PWA 特定商店 space 的内容,您的外部应用程序无法访问这些内容。

<input type="file"> 是您访问常规存储文件系统的唯一方式,它没有任何偶数侦听器。

您所期待的是许多开发人员希望尽快获得的东西,但不是一般的 PWA 规范形式。正如您所提到的,它主要被安全约束所阻止。想一想我们在 Web 浏览器中访问的所有 PWA 网站(对于最终用户来说看起来像一个普通的 Web)都可以访问您的完整文件系统。谁会接受并喜欢这个事实?没有人。一旦将 PWA 添加到主屏幕,PWA 应该会发展为具有单独的权限,我们可以期待在那之后看到这些功能。

更新: 必须同时使用文件系统和 PWA 的唯一替代解决方案是将 PWA 包装在 Cordova 中并使用本机文件系统 API 以及 PWA 功能像服务工作者一样具有离线能力。如果您的目标用户 webview 足够新(v40+),它将支持服务工作者。使用此选项,虽然无法通过 "Add to home screen" 选项分发应用程序,但如果这样做,它将不支持文件系统访问。

使用 Electron 包装您的网络应用程序可以是另一种替代方法,它还可以访问您的文件系统。 Atom、VS Code 等 IDE 是使用 Electron 和 HTML/CSS/JS.

构建的

由于这个问题最近引起了很多关注,对于任何对此主题感兴趣的人都有非常令人兴奋的消息:Writable Files API(现在称为文件系统访问 API)。

此时提议的新 API 仅处于设计阶段,并且对引入它们的机会本身进行了生动的讨论。所以看起来我们离生产就绪的解决方案还很远。

更新 2019-04-12

现在有一个 explainer(也在上面提到的 post 中链接),其中包含很多关于提议的 API 和 will/should 工作原理的有用信息。

更新 2021-02-19

文件系统访问 API 仍在很好地发展。除了上次更新提到的解释器之外,还有一个draft doc on MDN Web Docs

更新 2021-10-14

了解有关文件系统访问的更多信息的一个很好的起点 API 仍然是 this post on web.dev,它会不断更新。