例如,如果你点击链接:
数据:应用程序/八进制;base64 SGVsbG8 =
浏览器将提示您下载一个文件,该文件由超链接本身中base64所包含的数据组成。是否有办法在标记中建议一个默认名称?如果不是,是否有JavaScript解决方案?
例如,如果你点击链接:
数据:应用程序/八进制;base64 SGVsbG8 =
浏览器将提示您下载一个文件,该文件由超链接本身中base64所包含的数据组成。是否有办法在标记中建议一个默认名称?如果不是,是否有JavaScript解决方案?
当前回答
No.
整个目的是它是一个数据流,而不是一个文件。数据源不应该知道用户代理将其作为文件处理……事实并非如此。
其他回答
根据RFC 2397,没有。
<a>元素似乎也没有任何可以使用的属性。
然而,HTML5随后在<a>元素上引入了下载属性,尽管在编写时支持并不普遍(例如,没有MSIE支持)。
仅限HTML:使用download属性:
<a download="logo.gif" href="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">下载透明png</a> .gif
仅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(它们不支持下载属性)将用默认名称下载文件,或者简单地在新选项卡中显示,如果文件类型是受支持的:图像、视频、音频文件……
使用服务工作者,这最终在真正意义上成为可能。
创建一个假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 );
}
});
下面是一个基于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();
No.
整个目的是它是一个数据流,而不是一个文件。数据源不应该知道用户代理将其作为文件处理……事实并非如此。