例如,如果你点击链接:

数据:应用程序/八进制;base64 SGVsbG8 =

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


当前回答

谷歌代码上有一个小的变通脚本,对我有用:

http://code.google.com/p/download-data-uri/

它添加一个包含数据的表单,提交该表单,然后再次删除该表单。很粗糙,但对我来说很管用。需要jQuery。

这个线程出现在谷歌谷歌代码页之前,我认为它可能有帮助,在这里也有链接。

其他回答

根据RFC 2397,没有。

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

然而,HTML5随后在<a>元素上引入了下载属性,尽管在编写时支持并不普遍(例如,没有MSIE支持)。

使用download属性:

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

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

下面是一个基于Holf版本的jQuery版本,可用于Chrome和Firefox,而他的版本似乎只适用于Chrome。在身体上添加一些东西来做到这一点有点奇怪,但如果有人有更好的选择,我完全支持。

var exportFileName = "export-" + filename;
$('<a></a>', {
    "download": exportFileName,
    "href": "data:," + JSON.stringify(exportData, null,5),
    "id": "exportDataID"
}).appendTo("body")[0].click().remove();

使用服务工作者,这最终在真正意义上成为可能。

创建一个假URL。例如/saveAs/myPrettyName.jpg 在<a href, <img src,窗口中使用URL。open(url),绝对可以用“真正的”url做任何事情。 在worker内部,捕获fetch事件,并用正确的数据进行响应。

浏览器现在会建议myPrettyName.jpg,即使用户在一个新的选项卡打开文件,并试图保存它。这将完全像文件来自服务器一样。

// In the service worker
self.addEventListener( 'fetch', function(e)
{
    if( e.request.url.startsWith( '/blobUri/' ) )
    {
        // Logic to select correct dataUri, and return it as a Response
        e.respondWith( dataURLAsRequest );
    }
});

你实际上可以在Chrome和FireFox中实现。

尝试下面的url,它将下载使用的代码。

data:text/html;base64,PGEgaHJlZj0iZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LFBHRWdhSEpsWmowaVVGVlVYMFJCVkVGZlZWSkpYMGhGVWtVaUlHUnZkMjVzYjJGa1BTSjBaWE4wTG1oMGJXd2lQZ284YzJOeWFYQjBQZ3BrYjJOMWJXVnVkQzV4ZFdWeWVWTmxiR1ZqZEc5eUtDZGhKeWt1WTJ4cFkyc29LVHNLUEM5elkzSnBjSFErIiBkb3dubG9hZD0idGVzdC5odG1sIj4KPHNjcmlwdD4KZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYScpLmNsaWNrKCk7Cjwvc2NyaXB0Pg==