Javascript Chrome扩展如何将许多文件保存到用户指定的目录中?
我正在开发一个Chrome扩展,用作内部工具。其要求的行为是:Javascript Chrome扩展如何将许多文件保存到用户指定的目录中?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在开发一个Chrome扩展,用作内部工具。其要求的行为是: 作为页面操作,在查看某些intranet页面时启用地址栏图标 当用户单击图标时,在页面上标识特定媒体类型(例如,.jpg)的所有文件,然后 以静默方式将它们全部保存到用户本地驱动器上的目录中 ,但当时的答案是“及” 那么,目前实现这一目标的可行方式是什么?我看过的是: API---但这不会将文件保存在任何用户可访问的位置。相反,存储的文件位于未记录的目录中。用户要求文件以其原始名称存储在可访问的目录中 ,通过创建data:URL并
- API---但这不会将文件保存在任何用户可访问的位置。相反,存储的文件位于未记录的目录中。用户要求文件以其原始名称存储在可访问的目录中
- ,通过创建data:URL并以编程方式单击它。这会为每个文件弹出一个“另存为…”对话框,当单个页面上有100个资产时,这是不可接受的。用户要求下载文件时,除单击图标外,无需进一步交互
- 但这仅在beta和dev频道中可用。用户需要使用主流Chrome进行此扩展李>
- 通过创建一个简单地将文件保存到磁盘的小.exe来使用,然后将.jpg作为blob传递给它。这看起来非常麻烦,我甚至不知道如何可靠地将大的blob传递给像这样的前任
还有别的方法我可以试试吗?恐怕你已经做了功课,这意味着你已经考虑了所有可能的选择 实现您想要的最佳方式是(如您所述)使用支持的本机应用程序并通过本机消息传递进行通信。顺便说一句,由于带宽在内部网上很少是个问题,您可能会发现传递资源(如图像)URL并让应用程序下载并保存它们更简单。
(是的,这比简单地开发一个扩展要麻烦得多,但是一个人必须做他们必须做的事情,对吗?)
另一方面,如果您愿意牺牲一点用户体验来简化开发,我建议将HTML5的优点(允许您在本地创建和下载文件)与JS压缩库(例如,)相结合,这样用户只需下载一个zip文件(并且只需提示一次)。顺便说一句,如果用户愿意,他/她可以选择总是在没有提示的情况下下载文件(但你已经知道了)。你已经做了很多研究。事实上,没有任何插件或扩展,常规网页无法写入用户的文件系统。而且,正如您所观察到的,只提供对虚拟文件系统的访问 但是,您混淆了API和HTML5文件系统API。与HTML文件系统API不同,Chrome的
文件系统
(应用程序)API可以直接写入用户指定的文件系统(例如~/Documents
或%USERPROFILE%\Documents
)
此API仅适用于Chrome应用程序,不适用于扩展。这不是问题,特别是因为您正在开发一个内部工具,因为您可以安装应用程序和扩展程序,并使用它在扩展程序(页面操作)和应用程序(文件系统访问)()之间进行通信
关于:因为您的扩展是内部的,所以您可能可以强制用户进入beta/dev通道以使用此API。此API的唯一限制是文件将保存在用户定义的下载文件夹(的子目录)中
编辑:
chrome.downloads
API现在可以在所有频道使用,包括stable分支(自chrome 31以来)。使用本机消息应用程序idea
本机应用程序很麻烦,编写起来也很痛苦,因为文档很差,除非两端的JSON格式都完全正确,否则在控制台中看不到任何东西,因为stdin和stdout都被接管了
但是,完成后您会更高兴,因为您可以使用标准工具(例如,Windows资源管理器、十六进制编辑器、TeamViewer…)查看、移动和删除文件,或者查看正在发生的事情。Chrome的沙盒文件系统可以正常工作,但现在似乎是一条死胡同(没有其他浏览器能找到它)。没有人可能会为此开发第三方工具。当然,一旦一切正常运行,您可能不需要工具,但在此之前,调试是一场噩梦,因为您需要编写代码(以及大量代码)来跟踪目录中的文件、文件版本、剩余磁盘空间……另一种内部(或非内部)解决方案用法是连接到websocket服务器,本地或远程 您可以将其放在background.js或content.js中(对于
https://
,使用wss://
)
+1因为这个问题提到了Chrome扩展,我从来没有想过Chrome应用程序(尽管现在看起来很明显):)很好@RobW问题在于感知。人们听到“beta”,他们会想到“bug”,因此,无论何时遇到任何bug,他们都会认为这是由于处于beta状态,然后来找我。@Crashworks
chrome.downloads
API现在可以在chrome stable(31+)上下载。下面是一个更新的链接,指向chrome即将取消对chrome应用程序支持的示例。回到原点,该死。出于好奇,我们最终解决了这个问题,在我们的内部工具中完全放弃了Chrome和Web UI。这是一种解决方法D@Crashworks,而不是NPAPI,为什么不使用PPAPI?@Crashworks-你转向了什么?我们正在做类似的事情,在chrome中有很多工具。。。。“直接应用程序?”“EdWalm是的,我们回到QT中构建本地C++应用程序。请不要破坏您的帖子。一旦您发布了一个问题,您就已经将内容授权给了Stack Overflow社区(在CC by SA许可下)。如果你愿意
var ws = new WebSocket('ws://echo.websocket.org');
// var ws = new WebSocket('ws://127.0.0.1:9000');
ws.onmessage = function(res) {
console.log('received data:', res.data);
};
ws.onopen = function() {
ws.send('hello');
};