data:application/octet-stream;base64,SGVsbG8=
浏览器会提示您下载一个文件,该文件包含在超链接本身中以base64形式保存的数据。在标记中是否有一种方式可以建议一个默认名称?如果没有,是否有JavaScript解决方案?
data:application/octet-stream;base64,SGVsbG8=
使用download
属性:
<a download='FileName' href='your_url'>
在 Chrome、Firefox、Edge、Opera、桌面版 Safari 10+,iOS Safari 13+上都适用 download
属性,但不支持 IE11。
window.location.replace
来实现。例如,如果你想创建一个由window.URL.createObjectURL
生成的data:uri,并将其作为文件下载,你需要创建一个<a>标签并点击它:http://jsfiddle.net/flyingsheep/wpQtH/ (不,$(...).click()
不起作用)。 - flying sheep$('<a href="data:text/plain,Test" download="test.txt">')[0].click()
看起来运行良好(注意:我使用了本地的 click
方法,而不是 jQuery 的)。演示链接:http://jsfiddle.net/2zsRW/。 - Rob W如今,Chrome让这个过程非常简单:
function saveContent(fileContents, fileName)
{
var link = document.createElement('a');
link.download = fileName;
link.href = 'data:,' + fileContents;
link.click();
}
仅限HTML:使用download
属性:
<a download="logo.gif" href="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">Download transparent png</a>
Javascript only: 你可以使用以下代码保存任何数据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
属性)将以默认名称下载文件,或者如果文件类型是图片、视频、音频等受支持的文件类型,则在新标签页中直接显示。
data:
URI,这就是问题所提到的。此答案也适用于Blob和任何具有URI的内容。 - fregante我查看了Firefox源代码中的netwerk/protocol/data/nsDataHandler.cpp文件。
数据处理程序仅解析内容类型和字符集,并查看字符串中是否有“;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
以下JavaScript代码片段利用链接的新“download”属性并模拟点击,在Chrome中可以正常工作。
function downloadWithName(uri, name) {
var link = document.createElement("a");
link.download = name;
link.href = uri;
link.click();
}
以下示例演示其使用方法:
downloadWithName("data:,Hello%2C%20World!", "helloWorld.txt")
不。
整个目的是它是一个数据流,而非文件。数据源不应该知道用户代理将其处理为文件…也确实没有这种情况。
data:
的目的是将一个块的内部数据伪装成 URL 格式,而无需从协议源中读取它。@silex 回答中的链接显示,即使尚未实现,建议提供首选名称以进行写入也被认为很有用。 - Alnitakdata:
的特定发明目的是允许(小型)的 内联 内容以拼凑在一起的 URL 格式出现,以便可以被像图像标签这样的东西使用,而无需单独进行HTTP请求。HTML 规定 img src
属性的内容必须是一个URL,因此 RFC 2397 就创造了它。没有“数据源”。 - Alnitak<a download="abcd.cer"
href="data:application/stream;base64,MIIDhTC......">down</a>
<a href, <img src
,window.open( url )等任何可以使用“真实”URL的地方。如果用户在新标签页中打开文件并尝试在那里保存文件,浏览器现在将建议使用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 );
}
});
请查看此链接: http://lists.w3.org/Archives/Public/uri/2010Feb/0069.html
引用:
它甚至可以像这样在末尾添加;base64(至少在Opera中):
data:text/plain;charset=utf-8;headers=Content-Disposition%3A%20attachment%3B%20filename%3D%22with%20spaces.txt%22%0D%0AContent-Language%3A%20en;base64,4oiaDQo%3D
讨论中的其余消息中还有一些信息。
data:application/pdf;name=document.pdf;base64,BASE64_DATA_ENCODED
。 - mems