В приложении, где я могу загружать один или несколько файлов JSON и манипулировать их значениями, довольно сложно экспортировать их обратно в файловую систему;Я хочу иметь возможность выбрать один или несколько файлов в диалоговом окне со списком. Затем можно загрузить их как файл .json
с помощью собственного диалогового окна загрузки браузера, не выходя из приложения.
Чтобы придумать «угловой» способ, я сложил функцию в exportService
:
export(obj) {
const exportFile = new File([JSON.stringify(obj, null, 2)], filename, {type: 'application/json'})
}
Я пробовал оба конструктора File()
и Blob()
и с помощью window.assign()
отправляю браузер созданному BLOB-объекту. Это работает так, как должно, так как мне дают чистый JSON-файл, когда браузер отправляет мне его. Однако я не могу автоматически загрузить BLOB-объект после нажатия на кнопку, которая вызывает функцию export()
. Я могу выбрать один из следующих методов:
Для мышления node.js нужно использовать для него модуль и вызватьэто день, хотя я бы предпочел не использовать какие-либо внешние модули.
Вариант второй: создать гиперссылку в DOM и щелкнуть по ней
Для меня это неблагоприятно, так как вы можете мусоритьDOM со скрытыми ссылками, несмотря на возможность их удаления;В целом это кажется «хакерским» подходом, и, судя по другим примерам, над стековым потоком;это то, что делает вышеупомянутая библиотека FileSaver.
Реализация этого заключается в следующем:
const dllink = document.createElement('a');
dllink.href = exportFile;
dllink.download = filename + '.json';
dllink.click();
, но я думаю, что это немного излишне. Наряду с отсутствием надежных средств для гарантии того, что новый элемент может быть уничтожен.
Вариант третий: перейдите к URL-адресу файла с помощью Angular's DOMSanitizer и bypassSecurityTrustUrl
Я бы предположил, что этот метод намеренносоздание уязвимости в другом безопасном приложении, и, как правило, излишняя простота функциональности.
Вариант четвертый: использование заголовка HTTP content-disposition
Мне не удалось найти много информации оэтот новый заголовок все же, несмотря на то, что он, кажется, отступает при отправке веб-браузера приложения / пользователя на пользовательский URL, хотя и с более безопасным подходом?
Могу ли я пропустить какие-либо альтернативные варианты, или какой из них будетлучший подход? Существуют ли другие, желательно безопасные способы экспорта файла как загружаемого?