【问题标题】:Force download in Google Chrome Extension在 Google Chrome 扩展程序中强制下载
【发布时间】:2011-05-14 03:34:50
【问题描述】:

我正在编写一个 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。但似乎没有任何东西可用于此目的。

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

有人让这个工作吗?

【问题讨论】:

标签: google-chrome webkit google-chrome-extension force-download


【解决方案1】:

我在 Github 上的 Appmator 代码中是这样做的。

基本方法是构建你的 Blob,但是你想要(Chrome/WebKit/Firefox 在 XmlHttpRequest 上有一个 responseBlob,所以你可以使用它),创建一个 iframe(隐藏,显示:none)然后分配 iframe 的 src成为 Blob。

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

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);

【讨论】:

  • 我可能是盲人,但是在您的代码中,blob 创建的确切位置在哪里?我在哪里“输入 URL”(或 xmlhttprequest)?
  • 这段代码实际上已经过时了,但它是通过 BlobBuilder 和 bb.append()
  • ...如何使用“未过时”的代码? (我通过谷歌找到了这个答案......)
  • @KarelBílek 查看stackoverflow.com/questions/4003352/… 了解更多选项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2017-03-30
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多