小编典典

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

javascript

我正在开发一个Chrome扩展程序以用作内部工具。它要求的行为是:

  1. 作为页面操作,请在查看某些Intranet页面时启用地址栏图标。
  2. 当用户单击该图标时,在页面上标识某种特定媒体类型(例如.jpg)的所有文件,以及
  3. 将它们全部静默保存到用户本地驱动器上的目录中。

那么,目前可用的方法是什么?我看过的是:

  • 该chrome.FileSystem API —但这不保存任何用户访问的位置的文件。而是将存储的文件隐藏在未记录目录中的混淆名称后面。用户要求将文件以其原始名称存储在可访问的目录中。
  • HTML5下载属性,方法是创建数据:URL并以编程方式单击它。这会为每个文件弹出一个“另存为…”对话框,当单个页面上有一百个资产时,这是不可接受的。用户要求下载文件时,除了单击单个图标外,不能进行进一步的交互。
  • 该浏览器下载API,但那只是在测试和开发渠道提供。用户需要与主流Chrome浏览器一起使用此扩展程序。
  • 使用[Native Messaging API,方法是创建一个小的.exe,将文件保存到磁盘,然后将.jpg作为blob传递给它。这似乎很麻烦,我什至不确定如何可靠地将大blob传递给EXE。

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


阅读 848

收藏
2020-05-01

共1个答案

小编典典

您已经做了很多研究。确实,常规网页无法在没有任何插件或扩展的情况下写入用户的文件系统。而且,正如您所观察到的,HTML5 Filesystem
API
仅提供对虚拟文件系统的访问。

但是,您将chrome.fileSystemAPI与HTML5FileSystem API 混淆了。与HTML FileSystem API不同,Chrome的fileSystem(应用程序)API可以直接写入用户指定的用户文件系统(例如~/Documents%USERPROFILE%\Documents)。

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


关于chrome.downloads:由于您的扩展程序是内部的,因此您可以强制用户进入beta/dev通道才能使用此API。此API的唯一限制是文件将保存在用户定义的Downloads文件夹(的子目录)中。

编辑:chrome.downloads现在,所有通道都可以使用该API,包括稳定分支(自Chrome 31起)。

2020-05-01