下载数据 URL 文件

IT技术 javascript data-uri
2021-01-16 00:23:32

我正在考虑制作一个完全基于 JavaScript 的 zip/unzip 实用程序,任何人都可以从浏览器访问它。他们只需将他们的 zip 文件直接拖入浏览器,它就会让他们下载其中的所有文件。他们还可以通过拖入单个文件来创建新的 zip 文件。

我知道最好在服务器端进行,但这个项目只是为了好玩。

如果我利用各种可用的方法,将文件拖入浏览器应该很容易。(Gmail 风格)

编码/解码应该没问题。我看过一些 as3 zip 库,所以我相信我应该没问题。

我的问题是最后下载文件。

window.location = 'data:jpg/image;base64,/9j/4AAQSkZJR....' 

这在 Firefox 中工作正常,但在 Chrome 中无效。

我可以使用 将文件作为图像嵌入到 chrome 中<img src="data:jpg/image;ba.." />,但文件不一定是图像。它们可以是任何格式。

谁能想到另一种解决方案或某种解决方法?

6个回答

如果您还想为文件提供建议的名称(而不是默认的“下载”),您可以在 Chrome、Firefox 和某些 IE 版本中使用以下内容:

function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
}

以下示例显示了它的用途:

downloadURI("data:text/html,HelloWorld!", "helloWorld.txt");
按照这里的建议尝试了download.js它似乎有效。:)
2021-03-11 00:23:32
你可以用link.click()你的-function来简化它eventFire...... jsfiddle.net/ARTsinn/Ezx5m
2021-03-12 00:23:32
不错的解决方案。但是链接之后会变成什么?
2021-03-17 00:23:32
这仅适用于 Chrome。如果您希望它在 Firefox/IE 中工作,请查看@MartinoDino 的答案。
2021-03-17 00:23:32
变量 'link' 在函数结束时超出了作用域(注意我们从未将它添加到 dom 中),因此不久之后将被垃圾收集。
2021-04-04 00:23:32

function download(dataurl, filename) {
  const link = document.createElement("a");
  link.href = dataurl;
  link.download = filename;
  link.click();
}

download("data:text/html,HelloWorld!", "helloWorld.txt");

或者:

function download(url, filename) {
  fetch(url)
    .then(response => response.blob())
    .then(blob => {
      const link = document.createElement("a");
      link.href = URL.createObjectURL(blob);
      link.download = filename;
      link.click();
  })
  .catch(console.error);
}

download("https://get.geojs.io/v1/ip/geo.json","geoip.json")
download("data:text/html,HelloWorld!", "helloWorld.txt");

单击不存在元素上的事件:D 不需要 appendchild。
2021-03-15 00:23:32
是的。您可以在创建元素“a”后简单地调用 a.click(),然后设置 a 的 href。
2021-03-15 00:23:32
只要 dataUri 变得太大,就应该使用您的第二个解决方案(取决于浏览器,但根据我的经验,Chrome 不接受多兆字节的 Uri)。另请参阅stackoverflow.com/questions/38781968/...
2021-03-20 00:23:32
这适用于大多数现代浏览器,但我注意到附加到文档然后删除对于支持某些旧浏览器是必要的。
2021-03-24 00:23:32
过去直接调用 a.click() 是行不通的,但它可以处理事件。现在他们都工作了。
2021-04-05 00:23:32

想法:

  • 尝试<a href="data:...." target="_blank">(未经测试)

  • 使用downloadify而不是数据 URL(也适用于 IE)

如果您不能使用 Flash 但正在运行 Java 服务器端组件,则可以使用:github.com/suprememoocow/databounce它使用 Servlet 从客户端“反弹”数据。在其他服务器端技术(例如 Python、ASP.NET 等)中执行相同的技巧将相当容易
2021-03-21 00:23:32
@jcubic 感谢您指出无效链接。新的下载位置好像是github.com/dcneiner/Downloadify
2021-03-30 00:23:32
有没有不用flash灯的方法?所有浏览器的数据 URL,但 IE 和某种 ActiveX foo 用于 IE?(通过这种方式,我设法在没有 Flash 的情况下播放音乐:HTML5 音频适用于所有浏览器,但 IE 和 ActiveX 适用于 IE。)
2021-03-31 00:23:32
Downloadify 需要浏览器中的 Flash 播放器。如果用户没有 Flash 播放器,则文件不会下载
2021-03-31 00:23:32

想分享我的经验并帮助那些在 Firefox 中无法正常下载的人,并更新了 2014 年的答案。以下代码段在 Firefox 和 chrome 中都可以使用,并且可以接受文件名:

  // Construct the <a> element
  var link = document.createElement("a");
  link.download = thefilename;
  // Construct the uri
  var uri = 'data:text/csv;charset=utf-8;base64,' + someb64data
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  // Cleanup the DOM
  document.body.removeChild(link);
这导致窗口在 IE 11 中为我重定向到 href 值。 prevetDefault(); 不会停止 IE 中的行为
2021-03-11 00:23:32
谢谢,如果btoa未定义(例如在节点 eslinted 前端项目中) const btxt = new Buffer(text).toString('base64'); const uri = 'data:text/csv;charset=utf-8;base64,' + btxt + ';'
2021-03-11 00:23:32
不需要 document.body.appendChild ... 见我的回答stackoverflow.com/a/45905238/236062
2021-03-12 00:23:32
删除链接毫无意义,它在下一行超出范围并被垃圾收集,它不是删除的有效目标。
2021-03-31 00:23:32
不幸的是,它在 Safari 中不起作用。Safari 似乎无法识别该download属性。无论如何,这是我目前所能得到的最接近的结果。
2021-04-08 00:23:32

这是我在 Firefox 和 Chrome 但不在 Internet Explorer 中测试的纯 JavaScript 解决方案:

function downloadDataUrlFromJavascript(filename, dataUrl) {

    // Construct the 'a' element
    var link = document.createElement("a");
    link.download = filename;
    link.target = "_blank";

    // Construct the URI
    link.href = dataUrl;
    document.body.appendChild(link);
    link.click();

    // Cleanup the DOM
    document.body.removeChild(link);
    delete link;
}

迄今为止发现的跨浏览器解决方案:

下载 -> 需要 Flash

databounce -> 在 IE 10 和 11 中测试过,对我不起作用。需要一个 servlet 和一些自定义。(错误地检测导航器。我必须在兼容模式下设置 IE 进行测试,servlet 中的默认字符集,JavaScript 选项对象具有正确的 servlet 绝对路径路径......)对于非 IE 浏览器,它在同一窗口中打开文件。

download.js -> http://danml.com/download.html另一个类似但未测试的库。声称是纯 JavaScript,不需要 servlet 或 Flash,但不适用于 IE <= 9。

download.js 相当不错。刚刚对 IE11 进行了快速检查,它可以工作。非常感谢!
2021-04-07 00:23:32