Поскольку я искал способ создания и загрузки текстового файла с веб-сайта с JavaScript, я нашел множество решений, но обычно использовал либо Blob
/ createObjectURL
, либо иначе encodeURIComponent
с первым более популярным из того, что я видел. Ниже я приведу два примера: обратите внимание, что только одна-две строки в начале отличаются в двух функциях (что я отметил в комментариях).
Blob
/ createObjectURL
:
function dl_as_file_Blob(filename_to_dl, data_to_dl) {
let blobx = new Blob([data_to_dl], { type: 'text/plain' }); // ! Blob
let elemx = window.document.createElement('a');
elemx.href = window.URL.createObjectURL(blobx); // ! createObjectURL
elemx.download = filename_to_dl;
elemx.style.display = 'none';
document.body.appendChild(elemx);
elemx.click();
document.body.removeChild(elemx);
}
encodeURIComponent
:
function dl_as_file_URI(filename_to_dl, data_to_dl) {
let elemx = document.createElement('a');
elemx.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(data_to_dl); // ! encodeURIComponent
elemx.download = filename_to_dl;
elemx.style.display = 'none';
document.body.appendChild(elemx);
elemx.click();
document.body.removeChild(elemx);
}
Что я хотел бы знать, так это то, есть ли какая-либо причина предпочитать одно другому. До сих пор я мог найти две небольшие отличия. Во-первых, encodeURIComponent
более широко поддерживается браузерами, чем createObjectURL
. Во-вторых, Blob
не поддерживает кодировку . Исходя из этого, я бы выбрал решение encodeURIComponent
, но мне интересно, есть ли причина, по которой я вижу решение Blob
/ createObjectURL
чаще.
РЕДАКТИРОВАТЬ : Приведенный выше вопрос носит довольно общий характер, поэтому позвольте мне немного сузить для моего конкретного c варианта использования: я хочу разрешить пользователям загружать простой (utf-8), относительно небольшой (максимум 100-200 кБ) текст (результаты выполненного теста самооценки). Здесь нет действительно конфиденциальных данных, и файл нужен только для этой цели, на стороне клиента. Тем не менее, я также приветствую более общие ответы, так как мне интересно узнать о различиях.