Как заставить браузер отображать диалоговое окно «Сохранить как», чтобы пользователь мог сохранить содержимое строки в файл в своей системе?

Как сделать так, чтобы в браузере отображалось диалоговое окно «Сохранить как», чтобы пользователь мог сохранить содержимое строки в файл в своей системе?

Например:

var myString = "my string with some stuff";
save_to_filesystem(myString,"myString.txt");

В результате получается что-то вроде этого:

Пример


person MaiaVictor    schedule 05.07.2012    source источник
comment
Вы найдете ответ здесь: stackoverflow.com/questions/2897619/   -  person demux    schedule 05.07.2012
comment
@ArnarYngvason - это тот же процесс, что и в angularjs?   -  person bleyk    schedule 11.01.2016
comment
@bleykFaust, процедура одинакова для всех интерфейсных js-приложений.   -  person demux    schedule 11.01.2016


Ответы (6)


Если кому-то все еще интересно ...

У меня так получилось:

<a href="data:application/xml;charset=utf-8,your code here" download="filename.html">Save</a>

не могу вспомнить свой источник, но он использует следующие методы \ функции:

  1. атрибут загрузки html5
  2. данные uri's

Нашел ссылку:

http://paxcel.net/blog/savedownload-file-using-html5-javascript-the-download-attribute-2/


РЕДАКТИРОВАТЬ: Как вы можете понять из комментариев, это НЕ работает в

  1. Internet Explorer (хотя работает в Edge v13)
  2. iOS Safari
  3. опера мини

http://caniuse.com/#feat=download

person Craig Wayne    schedule 20.03.2014
comment
По состоянию на январь 2019 года он работает в (не iOS) Safari и браузере Android. По-прежнему нет iOS Safari, Opera Mini или IE. caniuse.com/#feat=download - person SeanMC; 14.01.2019
comment
@SeanKPS Можете ли вы заставить его запрашивать у пользователя папку, в которой его сохранить, несмотря на настройки браузера? - person Kyll; 21.02.2019
comment
Что ж, он современный, короткий, и он работает. Но он больше не дает диалогового окна «Сохранить как ...». Я хочу, чтобы пользователь мог изменить имя файла перед сохранением. - person Vaulter; 19.11.2019
comment
В win7 chrome 79 зависит от настроек браузера. Если пользователь снял флажок «Спрашивать, где сохранить каждый файл перед загрузкой», он будет загружен напрямую. - person user2959760; 31.12.2019
comment
На данный момент лучшим методом (май 2021 г.) является API доступа к файловой системе, подробно описанный здесь: web.dev/file -системный-доступ - person Alex Horlock; 20.05.2021
comment
Доступ к файловой системе выглядит довольно круто, но, насколько я могу судить, у него очень слабая поддержка: caniuse.com/native -filesystem-api - person IanVS; 27.05.2021

Для этого есть библиотека javascript, см. FileSaver.js на Github.

Однако функция saveAs() не будет отправлять браузеру чистую строку, вам нужно преобразовать ее в blob:

function data2blob(data, isBase64) {
  var chars = "";

  if (isBase64)
    chars = atob(data);
  else
    chars = data;

  var bytes = new Array(chars.length);
  for (var i = 0; i < chars.length; i++) {
    bytes[i] = chars.charCodeAt(i);
  }

  var blob = new Blob([new Uint8Array(bytes)]);
  return blob;
}

а затем вызовите saveAs в большом двоичном объекте, например:

var myString = "my string with some stuff";
saveAs( data2blob(myString), "myString.txt" );

Конечно, не забудьте включить вышеупомянутую библиотеку javascript на свою веб-страницу, используя <script src=FileSaver.js>

person Tomas M    schedule 15.04.2015
comment
Это просто сохраняет myString.txt в моей папке «Загрузки» без отображения диалогового окна. - person meetar; 17.04.2015
comment
Ах, нет, не знаю! Все они сохраняются автоматически. Так всегда ли это функция для каждого браузера или есть способ вызвать поведение с помощью скрипта? - person meetar; 17.04.2015
comment
Я считаю, что это функция для каждого браузера. В хроме выставляешь в настройках, расширенных настройках, чекбокс Спрашивать, куда сохранять каждый файл перед загрузкой - person Tomas M; 19.04.2015
comment
При обычных обстоятельствах невозможно получить диалоговое окно Win32 SaveAs. Лучший способ - использовать имя файла из пользовательского ввода. - person bryc; 14.01.2017

Существует новая спецификация, называемая Native File System API, которая позволяет вам делать это правильно. например это:

const result = await window.chooseFileSystemEntries({ type: "save-file" });

Здесь есть демонстрация , но я считаю, что она использует пробную версию origin, поэтому она может не работать на вашем собственном веб-сайте, если вы не зарегистрируетесь или не включите флаг конфигурации, и он, очевидно, работает только в Chrome. Если вы делаете приложение Electron, это может быть вариантом.

person Timmmm    schedule 01.05.2020
comment
Решить эту проблему в мае 2021 года казалось самым простым способом: developer.mozilla.org/en-US/docs/Web/API/Window/. Обратите внимание, что API изменился с момента публикации исходного сообщения. См. Также эту полезную статью: web.dev/file-system-access - person Alex Horlock; 20.05.2021


Решение с использованием только javascript

function saveFile(fileName,urlFile){
    let a = document.createElement("a");
    a.style = "display: none";
    document.body.appendChild(a);
    a.href = urlFile;
    a.download = fileName;
    a.click();
    window.URL.revokeObjectURL(url);
    a.remove();
}

let textData = `El contenido del archivo
que sera descargado`;
let blobData = new Blob([textData], {type: "text/plain"});
let url = window.URL.createObjectURL(blobData);
//let url = "pathExample/localFile.png"; // LocalFileDownload
saveFile('archivo.txt',url);
person Ronald Coarite    schedule 14.10.2020

Используя execComand:

<input type="button" name="save" value="Save" onclick="javascript:document.execCommand('SaveAs','true','your_file.txt')">

По следующей ссылке: execCommand

person jfraber    schedule 01.04.2015