提示:IE10+浏览器完全不支持以下方法。其他人已经完成了工作并实现了跨浏览器的解决方案。其中这个是其中之一。
首先,将生成的数据URL添加到<a>
标签的href
属性中。然而,在某些浏览器上,仅仅这样做是无法触发下载的。相反,它会在新页面中打开链接的图像。
对于base64图片的下载对话框:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...." class="image" />
根据上面的例子,将数据URL的MIME类型转换为这个:
<a href="data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg....">Download</a>
通过将数据的类型设置为application/octet-stream
,浏览器会要求你把它保存到硬盘上。
指定文件名:
正如Adi在下面的评论中所说,使用此方法定义文件名没有标准方法。但是,在某些浏览器中可能有两种方法可行。
A) 由Google Chrome引入的download
属性
<a download="image.png" href="...">
B) 在数据URL中定义HTTP头
headers=Content-Disposition: attachment; filename=image.png
<a href="data:application/octet-stream;headers=Content-Disposition%3A%20attachment%3B%20filename=image.png;base64,iVBORw0KGgoAAAA">
这在 Opera 的一些较旧的版本中至少是有效的。这里有关于这个问题的讨论。
查看主要浏览器的 Bug/Feature-Tracking 系统可以发现,定义文件名是社区的一个很大需求。也许我们将在不久的将来看到跨浏览器兼容的解决方案!;)
节省 RAM 和 CPU 资源:
如果您不想膨胀您访问者的浏览器 RAM,您还可以动态生成数据 URL:
<a id="dl" download="Canvas.png">Download Canvas</a>
function dlCanvas() {
var dt = canvas.toDataURL('image/png');
this.href = dt;
};
dl.addEventListener('click', dlCanvas, false);
这样,您的画布仍可以通过浏览器显示为图像文件。
如果您想增加打开下载对话框的概率,您应该扩展上面的函数,使其像上面所示进行替换:
function dlCanvas() {
var dt = canvas.toDataURL('image/png');
this.href = dt.replace(/^data:image\/[^;]/, 'data:application/octet-stream');
};
dl.addEventListener('click', dlCanvas, false);
最后,添加HTTP头以确保大多数浏览器向您提供有效的文件名! ;)
var canvas = document.getElementById("cnv");
var ctx = canvas.getContext("2d");
function r(ctx, x, y, w, h, c) {
ctx.beginPath();
ctx.rect(x, y, w, h);
ctx.strokeStyle = c;
ctx.stroke();
}
r(ctx, 0, 0, 32, 32, "black");
r(ctx, 4, 4, 16, 16, "red");
r(ctx, 8, 8, 16, 16, "green");
r(ctx, 12, 12, 16, 16, "blue");
function dlCanvas() {
var dt = canvas.toDataURL('image/png');
dt = dt.replace(/^data:image\/[^;]*/, 'data:application/octet-stream');
dt = dt.replace(/^data:application\/octet-stream/, 'data:application/octet-stream;headers=Content-Disposition%3A%20attachment%3B%20filename=Canvas.png');
this.href = dt;
};
document.getElementById("dl").addEventListener('click', dlCanvas, false);
<canvas id="cnv" width="32" height="32"></canvas>
<a id="dl" download="Canvas.png" href="#">Download Canvas</a>