强制下载Google Chrome扩展程序

Eri*_*off 5 webkit google-chrome google-chrome-extension force-download

我正在编写一个Google Chrome扩展程序,可让您下载数据的备份文件.我希望用户能够按下按钮并打开"另存为"对话框,他们可以将文件保存到他们的计算机上.似乎没有任何工作,我没有在互联网上找到答案.我尝试了几种方法:

  1. 使用document.execCommand('SaveAs', null, 'filename.json');这不起作用,因为此命令仅限IE,并且似乎没有Webkit替代方案
  2. 使用数据URI.这是最有前途的,也适用于Opera和Firefox,但问题是Chrome和Safari似乎都不支持URI中的Content-disposition = attachment; -header.这应该工作.(Chrome甚至不允许我ctrl/cmd+s从数据URI访问页面)
  3. 用一个XMLHTTPRequest.我没有试过这个,但是必须有一些方法可以转发请求吗?请注意,我不想使用外部服务器(在这种情况下,我可以简单地发送POST请求并应用Content-disposition:-header)
  4. 使用可用的Chrome扩展程序API.但似乎没有任何东西用于此目的.

我不想使用任何外部服务器的原因是我不想为托管付费,并且发送的数据可能对用户敏感,我不想侵犯任何人的隐私.

有没有人得到这个工作?

Kin*_*lan 3

我在 Github 上的 Appmator 代码中做了如下操作。

基本方法是按照您想要的方式构建您的 Blob(Chrome/WebKit/Firefox 在 XmlHttpRequest 上有一个 responseBlob,因此您可以使用它),创建一个 iframe(隐藏,显示:无),然后将 iframe 的 src 指定为斑点。

这将启动下载并将其保存到文件系统。唯一的问题是,您还无法设置文件名。

var savaeas = document.getElementById("saveas");
var bb = new (window.BlobBuilder || window.WebKitBlobBuilder)();

var output = Builder.output({"binary":true});
var ui8a = new Uint8Array(output.length);

for(var i = 0; i< output.length; i++) {
  ui8a[i] = output.charCodeAt(i);
}

bb.append(ui8a.buffer);

var blob = bb.getBlob("application/octet-stream");
var saveas = document.createElement("iframe");
saveas.style.display = "none";

if(!!window.createObjectURL == false) {
  saveas.src = window.webkitURL.createObjectURL(blob); 
}
else {
  saveas.src = window.createObjectURL(blob); 
}

document.body.appendChild(saveas);
Run Code Online (Sandbox Code Playgroud)