Автоматическая загрузка файлов ограничена 10 файлами в браузере Chrome - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть веб-страница, где мы генерируем PDF-файлы на основе выбора пользователем элементов на странице.Это вызывает обратную передачу (это страница ASP.NET WebForms), которая создает PDF-файлы на стороне сервера.Затем на страницу добавляется тег <a class="documentDownload"> для каждого элемента.

Когда страница перезагружается в браузере, выполняется следующий скрипт jQuery для автоматической загрузки файлов (если пользователь выбрал опцию автоматической загрузки).):

var divHost = document.createElement("div");
divHost.id = "elmntDnldLinks";
divHost.style.display = "none";
document.body.appendChild(divHost);

setTimeout(function() {
    $(".documentDownload").each(function(idx, val) {

        var lnkDownload = $(val),
            save = document.createElement("a");

        save.href = lnkDownload.attr("href");
        save.download = lnkDownload.attr("download");
        save.target = "_blank";
        divHost.appendChild(save);
        save.click();
    });
}, 1000);

Этот сценарий имеет задержку в 1 секунду, затем для каждого элемента .documentDownload он создает новый элемент <a> с тем же атрибутом href исходного элемента и добавляет его кНедавно добавленный скрытый элемент, а затем программно щелкает по нему.

[ Эта стратегия создания новых ссылок и щелчка по ним вместо щелчка по оригинальным элементам DOM обходит меру безопасности браузера. ]

Это отлично работает в Firefox, но Chrome никогда не загружает более 10 файлов.Зачем?Я вижу, например, 15 ссылок на странице и в скрытом элементе, но загружено только 10 файлов.

1 Ответ

0 голосов
/ 19 декабря 2018

Если вы сделаете паузу на 10 секунд между каждыми 10 загрузками, все они будут работать в Chrome.

Я использовал асинхронную функцию тайм-аута для этого временного решения:

function pause(msec) {
    return new Promise(
        (resolve, reject) => {
            setTimeout(resolve, msec || 1000);
        }
    );
}

async function downloadAll(elements) {
    var count = 0;
    for (var e in elements) {

        download(elements[e]); // your custom download code here, click or whatever

        if (++count >= 10) {
            await pause(1000);
            count = 0;
        }
    }
}

Простые тайм-ауты, умноженные наСчетчик элементов, вероятно, тоже может работать, но я не проверял его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...