Браузер / HTML принудительная загрузка изображения из src= " data:image / jpeg;base64…"
Я создаю изображение на стороне клиента и отображаю его с помощью HTML следующим образом:
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgM...."/>
Я хочу предложить возможность скачать созданное изображение.
Как я могу понять, что браузер открывает файл сохранить dialoge (или просто загрузить изображение, как chrome или firefox в папку загрузки будет делать), который позволяет пользователю сохранить изображение не делая правой кнопкой мыши и сохранить как на изображении?
Я бы предпочел решение без взаимодействия с сервером. Поэтому я знаю, что это было бы возможно, если бы я сначала загрузил изображение, а затем начал загрузку.
Спасибо большое!
4 ответа:
Просто замените
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's no need to add `MSBlobBuilder`. var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder); bb.append(arraybuffer); var blob = bb.getBlob('application/octet-stream'); // <-- Here's the Blob } // Use the URL object to create a temporary URL var url = (window.webkitURL || window.URL).createObjectURL(blob); location.href = url; // <-- Download! };
документация
вы можете использовать атрибут загрузки для тега a ...
<a href="data:image/jpeg;base64,/9j/4AAQSkZ..." download="filename.jpg"></a>
подробнее:https://developer.mozilla.org/en/HTML/element/a#attr-download
Я думаю img тег необходим как ребенок a тег следующим образом:
<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>
только с помощью a тег, как описано в #15, не работал для меня с последней версией Firefox и Chrome, но помещал одни и те же данные изображения в оба а.атрибут и 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);
посмотри Сохранитель файлов.js. Это обеспечивает удобный
saveAs
функция, которая заботится о большинстве специфических причуд браузера.