将 json 字符串保存到客户端电脑(使用 HTML5 API)

IT技术 javascript html
2021-03-02 11:02:32

我读了一些旧线程,但最近看到文件 API 发生了很大变化。我的要求是保存一个 json 文件(数据在本地 indexdDB 中,但我需要一种方法来备份它)。由于我使用 indexdDB,所以我只针对最近的浏览器,主要是 chrome。那么,是否可以将数据(json 字符串)保存到客户端计算机?

我看过http://eligrey.com/demos/FileSaver.js/,但有没有办法在本地做到这一点?

谢谢。

5个回答

您可以使用Blob和 HTML5a[download]功能来提供 JSON 备份下载:

var data = {a:1, b:2, c:3};
var json = JSON.stringify(data);
var blob = new Blob([json], {type: "application/json"});
var url  = URL.createObjectURL(blob);

var a = document.createElement('a');
a.download    = "backup.json";
a.href        = url;
a.textContent = "Download backup.json";

这是一个 jsfiddle 示例:http : //jsfiddle.net/potatosalad/yuM2N/

@potatosalad:恕我直言,这是有充分理由的。我努力为我的浏览器配置下载行为。不会有 Javascript 篡改它!顺便说一句,很酷的解决方案。谢谢你。
2021-04-19 11:02:32
+1 很棒!!有没有办法通过“另存为”按钮保存它。这将是理想的,如果不是,我会选择上述方法。谢谢。
2021-04-20 11:02:32
您可能需要研究类似Downloadify 的内容据我目前所知,没有简单的javascript跨浏览器方式来强制显示“另存为”对话框。有关更多信息,请参阅stackoverflow.com/questions/2897619/...。
2021-05-04 11:02:32

是的你可以。这假设您在text以下位置拥有 json

var toDownload=new Blob([text],{type:'x-whatever/x-backup'});
var link=window.URL.createObjectURL(toDownload);
window.location=link;

这是未经测试的,但它应该可以工作。

这几乎有效,但不允许我将内容保存在新窗口中,这也输出......我只能选择输出的内容,复制并粘贴到其他地方,知道如何实际保存输出吗?
2021-04-23 11:02:32

您可以使用FileSaver.js

示例代码:

//include the js file in html.
<script src="FileSaver.min.js"></script>    

// other code ...

//use it here.
var myjson= "{a:3, b:4}";
var blob = new Blob([myjson], {type: "application/json"});

var saveAs = window.saveAs;
saveAs(blob, "my_outfile.json");

用于JSON.stringify从 JSON 创建字符串。

小提琴:https : //jsfiddle.net/9w9ofec4/3/

这个答案并没有回答问题......问题的描述表明他已经看过 FileSaver 但想要一个本机解决方案。对不起兄弟
2021-04-30 11:02:32
FileSaver 解决方案实际上在可用时使用 HTML5 api,并且对于较旧的浏览器它运行良好,这比使用纯 HTML5 更好。所以,也许有人应该说,是的,当然有代码,但是为什么要麻烦,当代码在许多浏览器中失败时,最好使用好的库。
2021-05-05 11:02:32

基于土豆沙拉的答案,我尝试了一个“自我”更新链接:
jsfiddle

function saveAsFile(link, content, filename) {
    var blob = new Blob([content], {type: "text/text"});
    var url  = URL.createObjectURL(blob);

    // update link to new 'url'
    link.download    = filename + ".txt";
    link.href        = url;
}

saveAsFile(this, "YourContent", "HelloWorldFile");

该函数saveAsFile()需要调用a元素作为第一个参数。
比它将href目标更新为新的 blob。

function saveAsJSON(data, name=Date.now()+'.json') {
  const a = document.createElement('a')
  a.download = name
  a.href = URL.createObjectURL(new Blob([JSON.stringify(data)], {type: 'application/json'}))
  a.click()
}

// https://stackoverflow.com/questions/62371219/chrome-stops-download-files-from-stackoverflow-snippets
saveAsJSON(['orange', 'banana', {name: 'apple'}])