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

Cra*_*rks 68 javascript google-chrome google-chrome-extension

我正在使用Chrome扩展程序作为内部工具.它的必要行为是:

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

之前已经问过这个问题,但答案是" 使用NPAPI ",而NPAPI现在已经废弃了.

那么,目前实现这一目标的方法是什么?我看过的是:

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

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

Rob*_*b W 50

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

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

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


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

编辑:chrome.downloadsAPI现在可用于所有渠道,包括稳定分支(自Chrome 31以来).

  • @RobW问题在于感知.人们听到"测试版",他们认为是"错误",因此每当他们遇到任何类型的错误时,他们都会认为这是由于处于测试阶段并向我询问. (3认同)
  • ** Chrome即将取消对Chrome应用的支持**。回到广场一号,该死。 (2认同)

gka*_*pak 6

我担心你已经完成了你的功课,这意味着你看了所有可能的选择.

实现您想要的最佳方式是(如您所述)使用支持本机应用程序并通过Native Messaging进行通信.顺便说一句,由于带宽很少是内部网的问题,您可能会发现传递资源(例如图像)URL并让应用程序下载并保存它们更简单.
(是的,它比简单地开发扩展程序更麻烦,但是必须做他们必须做的事情,对吧?)

另一方面,如果您愿意牺牲一点用户的开发简单性经验,我建议使用JS压缩库(例如JSZip)组合HTML5好东​​西(允许您在本地创建和下载文件),因此用户只需下载一个zip文件(并且只提示一次).顺便说一句,如果用户希望,他/她可以选择总是在没有提示的情况下下载文件(但你已经知道了).