Ответ 1
Информация: IE10 + вообще не поддерживает метод ниже. Другие люди уже выполнили работу и реализовали кросс-браузерные решения. Это является одним из них.
Сначала добавьте сгенерированный URL-адрес данных в атрибут href
тега <a>
.
Однако в некоторых браузерах это само по себе не приведет к загрузке. Вместо этого он откроет связанное изображение на новой странице.
Диалог загрузки для изображения base64:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...." class="image" />
В соответствии с приведенным выше примером преобразуйте MIME-тип URL-адреса данных в это:
<a href="data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg....">Download</a>
Сообщая браузеру, что данные application/octet-stream
, он попросит вас сохранить его на вашем жестком диске.
Указание имени файла:
Как Adi в комментариях ниже, нет стандартного способа определить имя файла, используя этот метод. Но есть два подхода, которые могут работать в некоторых браузерах.
A) Атрибут download
, введенный Google Crome
<a download="image.png" href="...">
B) Определение заголовков HTTP в URL-адресе данных 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 основных браузеров показывает, что определение имени файла является довольно большим пожеланием сообщества. Возможно, в ближайшем будущем мы увидим совместимое с кросс-браузером решение!;)
Сохранить операционные ресурсы и ресурсы процессора:
Если вы не хотите раздувать ОЗУ вашего браузера посетителя, вы также можете динамически генерировать 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");
/* FILL CANVAS WITH IMAGE DATA */
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");
/* REGISTER DOWNLOAD HANDLER */
/* Only convert the canvas to Data URL when the user clicks.
This saves RAM and CPU ressources in case this feature is not required. */
function dlCanvas() {
var dt = canvas.toDataURL('image/png');
/* Change MIME type to trick the browser to downlaod the file instead of displaying it */
dt = dt.replace(/^data:image\/[^;]*/, 'data:application/octet-stream');
/* In addition to <a> "download" attribute, you can define HTTP-style headers */
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>