Chrome扩展程序如何将许多文件保存到用户指定的目录?
我正在使用Chrome扩展作为内部工具。 其要求的行为是:
- 作为页面操作,在查看特定的Intranet页面时启用地址栏图标。
- 当用户点击图标时,识别页面上某个媒体types(比如说.jpg)的所有文件
- 静静地将它们全部保存到用户本地驱动器上的目录中。
这个问题之前已经被问过了 ,但是答案是“ 使用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是一场噩梦,因为你需要编写代码(以及相当多的代码)来追踪哪些文件在哪些目录,文件版本中磁盘空间…