Browser/HTML Force загрузка изображения из src= "data: image/jpeg; base64..."
Я создаю изображение на стороне клиента, и я показываю его с HTML следующим образом:
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgM...."/>
Я хочу предложить возможность загрузить сгенерированное изображение.
Как я могу понять, что браузер открывает диалоговое окно сохранения файла (или просто загружает изображение, например chrome или firefox, в папку загрузки), которое позволяет пользователю сохранять изображение , не делая правый щелчок и сохраняя как на изображении?
Я бы предпочел решение без взаимодействия с сервером. Поэтому я знаю, что было бы возможно, если бы я сначала загрузил изображение, а затем начал загрузку.
Спасибо большое!
Ответы
Ответ 1
Просто замените image/jpeg
на application/octet-stream
. Клиент не распознает URL как встроенный ресурс и запрашивает диалоговое окно загрузки.
Простое решение JavaScript:
//var img = reference to image
var url = img.src.replace(/^data:image\/[^;]+/, 'data:application/octet-stream');
window.open(url);
// Or perhaps: location.href = url;
// Or even setting the location of an <iframe> element,
Другим методом является использование blob:
URI:
var img = document.images[0];
img.onclick = function() {
// atob to base64_decode the data-URI
var image_data = atob(img.src.split(',')[1]);
// Use typed arrays to convert the binary data to a Blob
var arraybuffer = new ArrayBuffer(image_data.length);
var view = new Uint8Array(arraybuffer);
for (var i=0; i<image_data.length; i++) {
view[i] = image_data.charCodeAt(i) & 0xff;
}
try {
// This is the recommended method:
var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
} catch (e) {
// The BlobBuilder API has been deprecated in favour of Blob, but older
// browsers don't know about the Blob constructor
// IE10 also supports BlobBuilder, but since the `Blob` constructor
// also works, there no need to add `MSBlobBuilder`.
var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
bb.append(arraybuffer);
var blob = bb.getBlob('application/octet-stream'); // <-- Here the Blob
}
// Use the URL object to create a temporary URL
var url = (window.webkitURL || window.URL).createObjectURL(blob);
location.href = url; // <-- Download!
};
Соответствующая документация
Ответ 2
вы можете использовать атрибут загрузки в теге...
<a href="data:image/jpeg;base64,/9j/4AAQSkZ..." download="filename.jpg"></a>
см. больше: https://developer.mozilla.org/en/HTML/element/a#attr-download
Ответ 3
Я предполагаю, что тег img необходим как дочерний элемент тега, следующим образом:
<a download="YourFileName.jpeg" href="data:image/jpeg;base64,iVBO...CYII=">
<img src="data:image/jpeg;base64,iVBO...CYII="></img>
</a>
или
<a download="YourFileName.jpeg" href="/path/to/OtherFile.jpg">
<img src="/path/to/OtherFile.jpg"></img>
</a>
Использование тега, как описано в № 15, не сработало для меня с последней версией Firefox и Chrome, но для меня работали те же данные изображения, что и теги a.href и img.src.
Из JavaScript он может быть сгенерирован следующим образом:
var data = canvas.toDataURL("image/jpeg");
var img = document.createElement('img');
img.src = data;
var a = document.createElement('a');
a.setAttribute("download", "YourFileName.jpeg");
a.setAttribute("href", data);
a.appendChild(img);
var w = open();
w.document.title = 'Export Image';
w.document.body.innerHTML = 'Left-click on the image to save it.';
w.document.body.appendChild(a);
Ответ 4
Взгляните на FileSaver.js. Он предоставляет удобную функцию saveAs
, которая учитывает большинство специфических особенностей браузера.