Chrome 扩展程序:如何将文件保存到磁盘上
-
23-09-2019 - |
题
我目前正在为 google chrome 创建一个扩展,它可以保存硬盘上的所有图像或图像链接。
问题是我不知道如何使用 JS 或 Google Chrome Extension API 将文件保存在磁盘上。
你有主意吗?
解决方案
您可以使用 HTML5 文件系统功能 使用以下命令写入磁盘 下载 API。这是将文件下载到磁盘的唯一方法,但它是有限的。
你可以看看 NPAPI 插件。另一种实现您需要的方法是通过 XHR POST 向外部网站发送请求,然后发送另一个 GET 请求来检索文件,该请求将显示为保存文件对话框。
例如,对于我的浏览器扩展 我的环聊 我创建了一个实用程序来将照片从 HTML5 Canvas 直接下载到磁盘。你可以在这里查看代码 capture_gallery_downloader.js 执行此操作的代码是:
var url = window.webkitURL || window.URL || window.mozURL || window.msURL;
var a = document.createElement('a');
a.download = 'MyHangouts-MomentCapture.jpg';
a.href = url.createObjectURL(dataURIToBlob(data.active, 'jpg'));
a.textContent = 'Click here to download!';
a.dataset.downloadurl = ['jpg', a.download, a.href].join(':');
如果您想在 HTML5 中实现将 URI 转换为 Blob,我是这样做的:
/**
* Converts the Data Image URI to a Blob.
*
* @param {string} dataURI base64 data image URI.
* @param {string} mimetype the image mimetype.
*/
var dataURIToBlob = function(dataURI, mimetype) {
var BASE64_MARKER = ';base64,';
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var uInt8Array = new Uint8Array(rawLength);
for (var i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
var bb = new this.BlobBuilder();
bb.append(uInt8Array.buffer);
return bb.getBlob(mimetype);
};
然后,在用户单击下载按钮后,它将使用“下载”HTML5 文件 API 将 blob URI 下载到文件中。
其他提示
我老早就希望使Chrome扩展程序自己批量下载图片。然而,每一次我很沮丧,因为只有看似适用的选择是NPAPI,这既Chrome和Firefox似乎都在支持任何再没有欲望。
我建议那些谁仍然希望实施“保存文件,磁盘上的”功能来看看这的#1帖子,本文下面的帮助评论我很多东西。
现在,因为铬31+,所述chrome.downloads
API变得稳定。我们可以用它来编程下载文件。如果用户没有设置在Chrome设置的ask me before every download
高级选项中,我们可以保存文件,而不提示用户进行确认!
下面是我使用(在扩展的背景页面):
// remember to add "permissions": ["downloads"] to manifest.json
// this snippet is inside a onMessage() listener function
var imgurl = "https://www.google.com.hk/images/srpr/logo11w.png";
chrome.downloads.download({url:imgurl},function(downloadId){
console.log("download begin, the downId is:" + downloadId);
});
虽然这是一个遗憾的是铬仍然没有提供Event
当下载completes.chrome.downloads.download
的回调函数被调用时,下载begin
成功(没有完成)
约chrome.downloads
is rel="noreferrer">这里的正式文档。
这不是我的有关解决方案的最初的想法,但我张贴在这里希望,它可能是一些使用的人的。
有没有办法,我知道的默默保存文件至用户的车程,这是它看起来像你希望做的事。我想,你可以要求文件的同时要保存一个(提示用户每次)使用类似:
function saveAsMe (filename)
{
document.execCommand('SaveAs',null,filename)
}
如果你想只提示用户一次,你可以抓住所有的图像默默地,压缩起来的包,然后让用户下载软件,。这可能意味着上的所有文件做的XmlHttpRequest,在Javascript荏苒它们,把它们上传到一个临时区域,然后询问用户是否想下载的zip文件。声音荒谬的,我知道了。
有在浏览器本地存储选项,但他们只对开发者的使用,在沙箱中,据我所知。 (例如,Gmail的离线缓存。)请参阅从谷歌最近宣布如这一个。
考虑使用 HTML5文件系统,使书面文件可能使用功能的JavaScript。
由于使用Javascript搭便车上涨到您的计算机从几乎的的任何地方的,那将是危险的,给它的能力,以写入到磁盘的网页。
它不允许的。你以为Chrome扩展需要用户交互?否则可能落入相同的类别。