Ссылка на файл Chrome большой длины — сбой вкладки

#javascript #google-chrome #download #jszip

#javascript #google-chrome #Скачать #jszip

Вопрос:

Я использую JSZip для создания zip-файлов на моей HTML-странице. После создания zip-файлов я помещаю эти файлы для загрузки, используя следующий механизм

 document.getElementById(elementId).href = "data:application/zip;base64," content;
  

Это отлично работает в обычных ситуациях. Однако иногда zip-файлы имеют длину более 2 МБ, и, следовательно, URL-адрес становится длиной более 2097152 символов. Когда я нажимаю на эту ссылку, вкладка вылетает. По этой ссылке я обнаружил, что

Текущее ограничение длины URL-адреса в Chrome составляет 2097152 символа

Я хотел знать, каковы возможные способы решения этой проблемы без разделения zip-файла. Есть ли другой способ представить файл для загрузки?

Ответ №1:

Вы можете использовать saveAs в последних браузерах (или FileSaver.js полифилл). Из http://stuk.github.io/jszip/documentation/howto/write_zip.html :

 var blob = zip.generate({type:"blob"});
saveAs(blob, "hello.zip");
  

Комментарии:

1. Спасибо, Дэвид. Я попробую это, но у меня возник вопрос. Открывает ли SaveAs всплывающее окно, например location.href? Потому что я не хочу всплывающего окна. Вместо этого я хочу сохранить ссылку на скачивание в элементе, который пользователь может позже щелкнуть для загрузки. Причина этого в том, что во время 1 запуска создается несколько zip-файлов, и я бы не хотел, чтобы всплывающее окно запрашивало сохранение для каждого файла. Спасибо.

2. Да, вы получите всплывающее окно загрузки, как только вы позвоните saveAs . Вы можете использовать URL-адрес большого двоичного объекта, чтобы получить желаемое поведение (обязательно протестируйте на IE 10/11, у меня были проблемы с ними в прошлый раз, когда я пытался). Другим решением является сохранение сгенерированного zip-файла и запуск saveAs вызова, когда пользователь нажимает на ссылку.

3. Как бы я сохранил zip и запустил сохранение по щелчку? Где большой двоичный объект будет храниться в течение этого периода?