Как сохранить изображение base64 на пользовательский диск с помощью JavaScript?
Я преобразовал исходный контент из тега <img>
html в base64String, используя JavaScript. Изображение было отображено четко. Теперь я хочу сохранить это изображение на диске пользователя с помощью JavaScript.
<html>
<head>
<script>
function saveImageAs () {
var imgOrURL;
embedImage.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA" +
"AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO" +
"9TXL0Y4OHwAAAABJRU5ErkJggg==";
imgOrURL = embedImage;
if (typeof imgOrURL == 'object')
imgOrURL = embedImage.src;
window.win = open(imgOrURL);
setTimeout('win.document.execCommand("SaveAs")', 0);
}
</script>
</head>
<body>
<a href="#" ONCLICK="saveImageAs(); return false" >save image</a>
<img id="embedImage" alt="Red dot">
</body>
</html>
Этот код хорошо работал, когда я установил путь к изображению в качестве источника для HTML-тега <img>
. Тем не менее, когда я передаю источник как base64String не работает.
Как добиться того, чего я хочу?
Ответы
Ответ 1
Просто чтобы позволить пользователю загрузить изображение или другой файл, вы можете использовать атрибут HTML5 download
.
Загрузка статического файла
<a href="/images/image-name.jpg" download>
<!-- OR -->
<a href="/images/image-name.jpg" download="new-image-name.jpg">
Динамическая загрузка файлов
В случаях динамического запроса изображения можно эмулировать такую загрузку.
Если ваше изображение уже загружено и у вас есть источник base64
, то:
saveBase64AsFile(base64, fileName) {
var link = document.createElement("a");
link.setAttribute("href", base64);
link.setAttribute("download", fileName);
link.click();
}
В противном случае, если файл изображения загружен как Blob
, вы можете использовать FileReader
для преобразования его в Base64:
saveBlobAsFile(blob, fileName) {
var reader = new FileReader();
reader.onloadend = function () {
var base64 = reader.result ;
var link = document.createElement("a");
link.setAttribute("href", base64);
link.setAttribute("download", fileName);
link.click();
};
reader.readAsDataURL(blob);
}
Плохие новости! Будьте осторожны: IE не поддерживается: Caniuse link
Ответ 2
В JavaScript вы не можете иметь прямой доступ к файловой системе.
Тем не менее, вы можете заставить браузер отображать диалоговое окно, позволяющее пользователю выбрать место сохранения. Для этого используйте метод replace
с Base64String и замените "image/png"
на "image/octet-stream"
:
"data:image/png;base64,iVBORw0KG...".replace("image/png", "image/octet-stream");
Кроме того, W3C-совместимые браузеры предоставляют 2 метода для работы с двоичными данными в кодировке base64:
Возможно, вы найдете их полезными в некотором роде...
Вот измененная версия того, что, как я понимаю, вам нужно:
window.addEventListener('DOMContentLoaded', () => {
const img = document.getElementById('embedImage');
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA' +
'AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO' +
'9TXL0Y4OHwAAAABJRU5ErkJggg==';
img.addEventListener('load', () => button.removeAttribute('disabled'));
const button = document.getElementById('saveImage');
button.addEventListener('click', () => {
window.location.href = img.src.replace('image/png', 'image/octet-stream');
});
});
<!DOCTYPE html>
<html>
<body>
<img id="embedImage" alt="Red dot" />
<button id="saveImage" disabled="disabled">save image</button>
</body>
</html>