Загрузка больших текстовых файлов из JS-окружения
Текстовый (и не только) файл можно слепить на ходу, используя client-side JS, и отдать юзеру на загрузку. Обычно для этого используют что-то вроде:
var $a = $('<a/>',
{
'href': 'data:' + mime + ';charset=utf-8,' + encodeURIComponent(data),
'download': _.isString(fname) ? fname : 'file.txt'
})
.appendTo(document.body);
$a[0].click();
$a.remove();
Т.е. формируется dataURI с указанием кодировки. А её содержимое экранируется за счёт encodeURI. В случае, если файл превышает некий предел, то начинаются проблемы в Chrome, который не позволяет скачать содержимое ругаясь на ошибку сети. Полагаю, что сбоит или encodeURIComponent, или же длина аттрибута href превышает некую норму. Firefox такими проблемами не страдает — 100+ MiB грузит, в то время как Chrome спотыкается уже на 15 MiB.
Можно попробовать паковать содержимое как base64, оставив суть подхода (dataURI + a[href]) неизменной, а можно воспользоваться Blob-ом.
Blob
Упаковываем строку в Blob-объект:
new Blob([str], { encoding: 'UTF-8', type: mime });
Получаем псевдо-ссылку на этот Blob-ресурс:
const link = (window.URL || window.webkitURL).createObjectURL(blob);
Ссылка будет начинаться с blob://. Подставляем её в [href] и дело в шляпе.
В случае, если загруженный файл содержит какую-то чушь, сбита кодировка, или же вам не удалось получить Blob-ресурс из строки, попробуйте воспользоваться ручной конвертацией в Blob, с использованием обычных или типизированных массивов. Примеры кода легко найти в сети. Да прибудет с вами сила!