如何让浏览器显示“另存为对话框”以便用户可以将字符串的内容保存到其系统上的文件中?

IT技术 javascript save savefiledialog
2021-02-02 06:13:08

如何让浏览器显示“另存为对话框”,以便用户可以将字符串的内容保存到其系统上的文件中?

例如:

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

结果是这样的:

例子

6个回答

万一有人还在想...

我是这样做的:

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

不记得我的来源,但它使用以下技术\功能:

  1. html5下载属性
  2. 数据 URI

找到参考:

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


编辑:你可以从收集的意见,但这工作,

  1. Internet Explorer(但适用于 Edge v13 及更高版本)
  2. 歌剧迷你

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

现在(2021 年 5 月)的最佳方法似乎是此处详述的文件系统访问 API:web.dev/file-system-access
2021-03-19 06:13:08
@SeanKPS不管浏览器设置如何,你能强迫它提示用户输入保存它的文件夹吗?
2021-03-25 06:13:08
截至 2019 年 1 月,它适用于(非 iOS)Safari、Android 浏览器。仍然没有 iOS Safari、Opera Mini 或 IE caniuse.com/#feat=download
2021-03-30 06:13:08
嗯,它很现代,很短,而且很管用。但是,它不再提供“另存为...”对话框我希望用户能够在保存之前更改文件名。
2021-04-02 06:13:08
在 win7 chrome 79 中,依赖于浏览器设置如果用户取消选中“下载前询问每个文件的保存位置”,它将直接下载。
2021-04-02 06:13:08

有一个 javascript 库,请参阅Github 上的 FileSaver.js

但是该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;
}

然后调用saveAsblob,如下所示:

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

当然记得在你的网页上使用上面提到的 javascript 库 <script src=FileSaver.js>

啊,不,我没有!它们都自动保存。那么这始终是每个浏览器的功能,还是有办法用脚本触发行为?
2021-03-20 06:13:08
在正常情况下不可能获得 Win32 SaveAs 对话框。最好的方法是使用来自用户输入的文件名。
2021-04-01 06:13:08
这只是将“myString.txt”保存到我的下载文件夹,而不显示对话框。
2021-04-02 06:13:08
我相信这是每个​​浏览器的功能。在 Chrome 中,您可以在设置、高级设置、“下载前询问每个文件的保存位置”复选框中进行设置
2021-04-07 06:13:08

有一个名为Native File System API的新规范,它允许您像这样正确地执行此操作

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

有一个演示在这里,但我相信,除非您注册或启用一个配置参数,它显然是利用原点审讯所以它可能不会在自己的网站工作,只在Chrome工作如果你正在制作一个 Electron 应用程序,这可能是一个选择。

2021年5月解决这个,这似乎是最简单的方法:developer.mozilla.org/en-US/docs/Web/API/Window/...请注意,自原始帖子以来 API 已更改。另请参阅这篇有用的文章:web.dev/file-system-access
2021-03-16 06:13:08

这可以使用 HTML5saveAs功能的跨浏览器 javascript 实现https : //github.com/koffsyrup/FileSaver.js

如果您只想保存文本,那么上述脚本适用于所有浏览器(包括所有版本的 IE),只使用 JS。

仅使用 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);