Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как открыть диалоговое окно Сохранить как (https://javascript.ru/forum/dom-window/85482-kak-otkryt-dialogovoe-okno-sokhranit-kak.html)

controllerr 17.09.2023 09:01

Как открыть диалоговое окно Сохранить как
 
Как динамически выбрать место сохранения файла на локальном компьютере с помощью чистого javascript.

Решение: В настройках браузера в Инструментах в Загруженных файлах выставить переключатель на Всегда спрашивать, куда сохранять файлы.

Вопрос: А если у пользователя этот переключатель стоит Сохранять по-умолчанию в Загрузки, то как временно на стороне пользователя включить этот переключатель.

voraa 17.09.2023 09:52

Чисто с помощью js никак.
Окно сохранения файла открывается при нажатии на ссылку (<a>) с атрибутом download. (Не уверен, но кажется в настройках браузера еще должно быть указано спрашивать место сохранения, а не сохранять автоматически в какую то папку).
Ну можно конечно на js создать элемент <a> с необходимыми атрибутами, проимитировать клик на нем и окно появится.

controllerr 17.09.2023 10:23

Пробовал через ссылку: <a href="text.txt" download>text</a>.
Файл text.txt лежит вместе с index.html. После нажатия на ссылку просто открывается содержимое файла на той же странице. Окно сохранить как не появляется.

Код html:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<a href="text.txt" download>text</a>
</body>
</html>

Делал как найте: https://webref.ru/html/a/download
Там по нажатию по ссылке Скачать файл открывается окно Сохранить как. У меня открывается сразу текст файла.
Как правильно написать текст ссылки на файл.

voraa 17.09.2023 10:37

При работе с сервером (если страница скачивается с сервера) диалоговое окно открывается.
При работе с локальной файловой системой, действительно файл выводится на страницу

Вот кстати
https://developer.mozilla.org/ru/doc...HTML/Element/a
В примечании к атрибуту download
Цитата:

Этот атрибут соблюдается только на ресурсах с тем же доменом.
При работе с локальной файловой системой понятие домена нет. И браузеры в разных случаях это по разному трактуют. Иногда считают весь локальный компьютер одним доменом, иногда только папку, а иногда считают, что раз нет домена, то они всегда разные.

controllerr 17.09.2023 11:29

С помощь программы Denwer и создания сайта действительно открывается окно Сохранить как. А нужно без сервера, чтобы только средствами обычной страницы html локального компьютера открывалось это окно в офлайне на стороне пользователя.

voraa 17.09.2023 11:32

Создатели браузеров не подумали, что вам это будет нужно. Они свои браузеры делают, в первую очередь, для работы по сети.

controllerr 17.09.2023 11:42

Может есть какая-нибудь библиотека javascipt?

Aetae 17.09.2023 11:51

Забудь о локальных html. Из создателей браузеров никто не заботится об их работоспособности, но зато постоянно накидывают всё новые и новые ограничения, причём произвольно и разрознено. Даже если ты заставишь что-то работать сейчас - совершенно не факт что уже завтра всё снова не сломается.

controllerr 17.09.2023 11:54

Другими словами, нельзя сделать без сервера!!!

На самом деле можно.
Есть файл html по ссылке: https://disk.yandex.ru/d/6qZUCpUlnpl5NA
Если нажать на этой странице на кнопку Экспорт -> Сохранить, то в офлайне (без интернета, без сервера) откроется окно Сохранить как.

Вопрос: Как это реализовано?

voraa 17.09.2023 12:33

Цитата:

Сообщение от controllerr
Вопрос: Как это реализовано?

Это просто реализовано в браузере. На любую ссылку можно ткнуть правой кнопкой мыши и выбрать в меню пункт Сохранить как.
Но js тут совершенно не при чем. Просто обычным кликом файл не сохранить.
Впрочем, если этот файл не скачивается откуда то, а создан как блоб непосредственно скриптом, и его url указан через URL.createObjectURL, то вполне возможно он сохранится. Такие url вроде по умолчанию имеют тот же домен, что и страница, которая их создала.
Надо пробовать, что будет при использовании локальных страниц.


Часовой пояс GMT +3, время: 10:51.