Скачивание массива изображений
Подскажите кто знает, можно ли при помощи js реализовать скачивание сразу нескольких изображений?
У меня есть массив урлов изображений: let imgs = ['https://javascript.ru/forum/images/ca_serenity/misc/logo.gif', 'https://javascript.ru/forum/image.php?u=60342&dateline=1502033143']; Есть кнопка: <button id="download">Скачать изображения</button> Можно ли одним нажатием кнопки выполнить скачивание сразу всех изображений из массива урлов? Если для реализации изображения должны быть как DOM-элементы, то для своей задачи я могу получить их как DOM через document.querySelectorAll('img.test'). Есть ещё хотелка чтобы при этом не появлялось окно с подтверждением для скачивания и была возможность задать папку на компе куда именно скачивать эти картинки (диск G/papka). Если решение геморойное, подскажите хотя бы в какую сторону рыть и смотреть. |
MC-XOBAHCK,
Была тут где-то темка, сейчас гляну |
Цитата:
|
Можно скачать как архив и распаковать куда нужно! 📦
<button id="download" disabled>Создание архива...</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.5/jszip.min.js"></script>
<script>
(async () => {
const imgs = [
'https://javascript.ru/forum/images/ca_serenity/misc/logo.gif',
'https://javascript.ru/forum/image.php?u=60342&dateline=1502033143'
];
const zip = new JSZip();
const extensions = {
"image/jpeg": ".jpg",
"image/gif": ".gif",
"image/svg+xml": ".svg",
"image/png": ".png",
};
var counter = 1;
for(const src of imgs) {
const response = await fetch(`https://cors-anywhere.herokuapp.com/${src}`);
const blob = await response.blob();
zip.file(
`file-${counter++}${extensions[blob.type]}`,
blob,
{ binary: true }
);
}
zip.generateAsync({ type: "blob" }).then(function(content) {
const button = document.getElementById("download");
const link = document.createElement("a");
link.download = "images.zip";
link.href = URL.createObjectURL(content);
button.textContent = "Скачать изображения";
button.disabled = false;
button.addEventListener("click", event => {
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
});
})();
</script>
|
Цитата:
function save(arr){
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.onload = function () {
var a = document.createElement('a');
a.href = window.URL.createObjectURL(xhr.response);
a.download = arr[0].split('/').pop()||arr[0];
a.style.display = 'none';
document.body.appendChild(a);
a.click();
a.remove();
arr.shift();
if(arr.length) save(arr);
};
xhr.open('GET', 'https://cors-anywhere.herokuapp.com/'+arr[0]);
xhr.send();
}
let imgs = ['https://javascript.ru/forum/images/ca_serenity/misc/logo.gif', 'https://javascript.ru/forum/image.php?u=60342&dateline=1502033143'];
save(imgs.slice());
|
Malleys, конкретно под то что мне сейчас нужно zip только усложняет, вынуждая потом ещё на лишние телодвижения. Но я уже давно хотел спросить да всё стеснялся про zip и возможность браузерами генерировать файлы.
Большое спасибо! Пример буду разбирать, у меня этот вопрос в другой задаче давно уже не решённый стоит. Цитата:
Спасибо за решение - то что нужно. |
Извините за беспокойство, а можно уточнить один момент по поводу строчки
xhr.open('GET', 'https://cors-anywhere.herokuapp.com/'+arr[0]);
У меня нет задачи парсить картинки с чужих сайтов. Мне нужно скачать картинки с просматриваемой страницы в браузере. Это как в контекстном меню браузера (если вызвать его на изображении) пункт "Сохранить картинку как...". Только у меня уже есть массив нужных мне изображений которые нужно скачать. Для решения такой задачи обязательно нужно делать запрос
xhr.open('GET', 'https://cors-anywhere.herokuapp.com/'+arr[0]);
Прочитал что у этого сервера есть ограничения и его могут ложить. P.S. Я на сайте когда ещё не знал HTML и правила оптимизации наделал кучу однотипных косяков. Теперь написал скрипт который находит эти ошибки при просмотре страниц. Просто скачивать по одной картинке через контекстное меню долго, нудно и можно пропустить. |
тогда удалите https://cors-anywhere.herokuapp.com/, это не обязательно
|
Цитата:
просто подставляем адрес картинки как есть в href ссылки с download, и программно кликаем. Для множества картинок можно в цикле, или по таймеру. |
Alexandroppolus,
при таком подходе откроется в окне браузера. |
| Часовой пояс GMT +3, время: 06:25. |