在使用 data: URI 时,有没有办法指定建议的文件名?

IT技术 javascript html url data-uri save-as
2021-01-30 17:50:27

例如,如果您点击以下链接:

data:application/octet-stream;base64,SGVsbG8=

浏览器将提示您下载一个文件,该文件由超链接本身中以 base64 格式保存的数据组成。有没有办法在标记中建议默认名称?如果没有,是否有 JavaScript 解决方案?

6个回答

使用download属性:

<a download='FileName' href='your_url'>

download属性适用于Chrome、Firefox、Edge、Opera、桌面 Safari 10+、iOS Safari 13+,不适用于 IE11。

除非所有浏览器都像 Chrome 一样……[叹气]
2021-03-22 17:50:27
@BioDesign:它甚至适用于数据:铬中的 URI。请参阅:jsfiddle.net/pYpqW
2021-03-25 17:50:27
@flyingsheep$('<a href="data:text/plain,Test" download="test.txt">')[0].click()似乎在这里工作正常(Chrome 23)(注意:我使用了本机click方法,而不是 jQuery 的方法)。演示:jsfiddle.net/2zsRW
2021-03-25 17:50:27
@flyingsheep 似乎他们正在 Firefox 中执行同源策略“在 Firefox 20 中,此属性仅适用于指向同源资源的链接。” developer.mozilla.org/en-US/docs/Web/HTML/Element/a在我的测试中,Chrome 没有这个限制。
2021-03-30 17:50:27
但你不能用window.location.replace. 例如,如果您想创建一个 data:uri 或由 生成的一个window.URL.createObjectURL,并将其下载为文件,则必须创建一个 <a> 并单击它:jsfiddle.net/flyingsheep/wpQtH(不,$(...).click()不起作用)
2021-03-31 17:50:27

如今,Chrome 使这变得非常简单:

function saveContent(fileContents, fileName)
{
    var link = document.createElement('a');
    link.download = fileName;
    link.href = 'data:,' + fileContents;
    link.click();
}
现在确实如此,但并不总是那么容易。其中许多答案来自多年前。它们也适用于其他浏览器。
2021-03-11 17:50:27
有关浏览器兼容性的完整列表,请参阅http://caniuse.com/#feat=download
2021-03-15 17:50:27
@tixastronauta:尽管该页面中有信息,但在我的 firefox 44 中不起作用。在 Chrome 中运行良好。48
2021-03-17 17:50:27
嗨@Holf 有没有办法添加文件类型或扩展名,或者它就像文件名一样简单?
2021-03-19 17:50:27
不知道所有这些其他答案都在谈论什么,这在 Chrome 30 中的第一次尝试中起作用。
2021-03-25 17:50:27

仅 HTML:使用download属性:

<a download="logo.gif" href="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">Download transparent png</a>


仅 Javascript:您可以使用以下代码保存任何数据 URI:

function saveAs(uri, filename) {
  var link = document.createElement('a');
  if (typeof link.download === 'string') {
    link.href = uri;
    link.download = filename;

    //Firefox requires the link to be in the body
    document.body.appendChild(link);
    
    //simulate click
    link.click();

    //remove the link when done
    document.body.removeChild(link);
  } else {
    window.open(uri);
  }
}

var file = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
saveAs(file, 'logo.gif');

Chrome、Firefox 和 Edge 13+将使用指定的文件名。

IE11、Edge 12 和 Safari 9不支持该download属性)将使用其默认名称下载文件,或者如果文件类型受支持,则它们只会在新选项卡中显示它:图像、视频、音频文件, ...

这两个演示在 Chrome 38 中对我来说都很好(但它们应该在 Chrome 14+ 中工作)
2021-03-15 17:50:27
对于更完整的解决方案,我建议downloadjs在 npm 上使用
2021-03-18 17:50:27
限制属于data:URI,这就是问题所提到的。这个答案也适用于 Blob 和任何其他有 URI 的东西
2021-03-18 17:50:27
2021-03-27 17:50:27
它对我有用,但浏览器页面会在此之后刷新。想知道如何防止吗?
2021-04-05 17:50:27

根据RFC 2397,不,没有。

似乎也没有您可以使用元素的任何属性<a>

然而 HTML5 随后download<a>元素引入了该属性,尽管在撰写本文时支持并不普遍(例如没有 MSIE 支持)

第二句话在撰写本文时是正确的,但现在不再正确不过,截至目前,它还没有得到广泛实施。
2021-03-15 17:50:27
@flyingsheep,它广泛实施。
2021-03-17 17:50:27
我写那条评论的时候不是三年前
2021-03-23 17:50:27
如果文件太长,下载失败
2021-03-23 17:50:27
有关更多信息,请参阅此评论:)
2021-04-06 17:50:27

我在 netwerk/protocol/data/nsDataHandler.cpp 中查看了一些 firefox 源

数据处理程序只解析内容/类型和字符集,并查看字符串中是否有“;base64”

rfc 没有指定文件名,至少 firefox 没有为其处理文件名,代码生成一个随机名称加上“.part”

我还检查了 Firefox 日志

[b2e140]: DOCSHELL 6e5ae00 InternalLoad data:application/octet-stream;base64,SGVsbG8=
[b2e140]: Found extension '' (filename is '', handling attachment: 0)
[b2e140]: HelperAppService::DoContent: mime 'application/octet-stream', extension ''
[b2e140]: Getting mimeinfo from type 'application/octet-stream' ext ''
[b2e140]: Extension lookup on '' found: 0x0
[b2e140]: Ext. lookup for '' found 0x0
[b2e140]: OS gave back 0x43609a0 - found: 0
[b2e140]: Searched extras (by type), rv 0x80004005
[b2e140]: MIME Info Summary: Type 'application/octet-stream', Primary Ext ''
[b2e140]: Type/Ext lookup found 0x43609a0

如果您想查看 mozilla 源代码,那么有趣的文件:

data uri handler: netwerk/protocol/data/nsDataHandler.cpp
where mozilla decides the filename: uriloader/exthandler/nsExternalHelperAppService.cpp
InternalLoad string in the log: docshell/base/nsDocShell.cpp

我认为您现在可以停止寻找解决方案,因为我怀疑没有 :)

正如在此线程中注意到的 html5 具有download属性,它也适用于 firefox 20 http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#attr-hyperlink-download

凉爽的!虽然我不一定同意 Firefox 是存在的最终权威。:)
2021-03-14 17:50:27