Chrome扩展程序如何将许多文件保存到用户指定的目录?

我正在使用Chrome扩展作为内部工具。 其要求的行为是:

  1. 作为页面操作,在查看特定的Intranet页面时启用地址栏图标。
  2. 当用户点击图标时,识别页面上某个媒体types(比如说.jpg)的所有文件
  3. 静静地将它们全部保存到用户本地驱动器上的目录中。

这个问题之前已经被问过了 ,但是答案是“ 使用NPAPI ”, NPAPI现在是失效的 。

那么,现在有什么办法可以实现呢? 我看过的是:

  • chrome.FileSystem API–但是这不会将文件保存在任何用户可访问的位置。 相反,存储的文件隐藏在未公开目录中的混淆名称后面 。 用户要求文件以原始名称存储在可访问的目录中。
  • HTML5下载属性 ,通过创build一个data:URL并以编程方式点击它。 这会popup每个文件的“另存为…”对话框,当单个页面上有一百个资源时,这是不可接受的。 用户需要下载文件,而不需要单一图标点击以外的进一步交互。
  • Chrome下载API ,但只能在testing版和开发者版中使用。 用户需要使用主streamChrome的扩展程序。
  • 通过创build一个小的.exe文件来简单地将文件保存到磁盘,然后将.jpg作为一个blob传递给它,使用本地消息API 。 这似乎非常麻烦,我甚至不知道如何可靠地通过大块到EXE这样的。

我可以尝试另一种方法吗?

你做了很多研究。 事实上,没有任何插件或扩展,常规网页不能写入用户的文件系统。 而且, HTML5 Filesystem API只能提供对虚拟文件系统的访问,正如您所看到的那样。

但是,您将chrome.fileSystem API与HTML5 FileSystem API混淆在一起。 与HTML FileSystem API不同,Chrome的fileSystem (app)API可以直接写入用户指定的用户文件系统(例如~/Documents%USERPROFILE%\Documents )。

此API仅适用于Chrome 应用 ,而不适用于扩展程序。 这不是一个问题,特别是因为你正在开发一个内部工具,因为你可以安装应用程序和扩展,并使用消息传递在扩展(页面动作)和应用程序(文件系统访问)( 示例 )之间进行通信。


关于chrome.downloads :由于您的扩展名是内部的,您可能可能会强制用户loginbeta / dev通道以使用此API。 这个API的唯一限制是文件将被保存在用户定义的Downloads文件夹的子目录中。

编辑: chrome.downloads API现在可在所有渠道,包括稳定的分支(自Chrome 31以来)。

我担心你做了功课,这意味着你考虑了所有可能的select。

要实现你想要的东西,最好的方法就是(如你所提到的)使用支持本地应用程序并通过本地消息传递。 顺便说一句,由于带宽在内联网上很less出现问题,因此您可能会发现传递资源(例如图像)URL更简单,并下载应用程序并保存它们。
(是的,比简单地开发一个扩展会更麻烦,但是他们必须做他们必须做的事,对吧?)

另一方面,如果你愿意为开发的简单性牺牲一点用户体验,那么我build议你将一个JS压缩库(例如JSZip )与HTML5的好东西(允许你在本地创build和下载一个文件)相结合,所以用户只需要下载一个zip文件(并且只提示一次)。 顺便说一句,如果用户希望,他/她可以select总是下载文件而不用提示(但你已经知道了)。

使用本地消息应用程序的想法。

原生应用程序很麻烦,而且编写起来很痛苦,因为文档很差,除非您在两端都正确地使用JSON格式,否则在控制台中不会看到任何内容,因为stdin和stdout会被接pipe。

但是,当你完成这个任务时,你会感到更高兴,因为你可以使用标准工具(例如,Windows资源pipe理器,hex编辑器,TeamViewer …)来查看,移动和删除文件,或者查看正在发生的事情。 Chrome的沙盒文件系统可以工作,但似乎现在已经成了一个死胡同(没有其他浏览器已经把它捡起来了)。 没有人可能为其开发第三方工具。 当然,一旦一切正常,你可能不需要工具,但是在那之前,debugging是一场噩梦,因为你需要编写代码(以及相当多的代码)来追踪哪些文件在哪些目录,文件版本中磁盘空间…