【发布时间】:2017-06-22 00:00:11
【问题描述】:
我在 javascript 中有一个 JSON 对象。我想简单地将 JSON 对象写入文本文件。从到目前为止我遇到的情况来看,由于客户端的安全问题,不可能这样做。有解决方法吗?如果最初放置一些虚拟值,是否可以修改已经存在的文件?
谢谢
【问题讨论】:
标签: javascript json
我在 javascript 中有一个 JSON 对象。我想简单地将 JSON 对象写入文本文件。从到目前为止我遇到的情况来看,由于客户端的安全问题,不可能这样做。有解决方法吗?如果最初放置一些虚拟值,是否可以修改已经存在的文件?
谢谢
【问题讨论】:
标签: javascript json
您可以做的一件事是将 JSON 设置为即时下载。
var data = "{name: 'Bob', occupation: 'Plumber'}";
var url = 'data:text/json;charset=utf8,' + encodeURIComponent(data);
window.open(url, '_blank');
window.focus();
工作演示:http://jsfiddle.net/sLq3F/
除此之外,由于安全原因,您不能将 JSON 写入客户端的文件。 (否则您可以访问您网站用户的文件系统。)您必须为此使用服务器端语言,并将文件存储在服务器端。
更正:看起来您可以写入文件,即用户文件系统的“沙盒部分”。请参阅下面 Kevin Jantzer 的评论。
另一个更正:抱歉,文件系统 API 未使用。来自 HTMl5Rocks 网站:“2014 年 4 月,在 public-webapps 上宣布文件系统 API 规范应被视为已死。其他浏览器对实现它没有兴趣。”
【讨论】:
{a:{1,2,3}, b:"33", c:{1,"a"}},但如果 encodeURIComponent 被 JSON.stringify替换,则结果正常。
data 是一个字符串,而不是一个原始对象。你可以只使用JSON.stringify(),但这会给你一个包含原始JSON字符串的URL,如果对象包含一个URL(或者实际上是任何带有斜杠的字符串),这可能会导致问题。如果您从原始对象开始,最可靠的方法是stringify() 它并 使用encodeURIComponent(),例如:var url = 'data:text/json;charset=utf8,' + encodeURIComponent(JSON.stringify(data));
也许这个解决方案更优雅一点,在 Chrome、FF 和 ie7 到 ie10 中进行了测试,使用文本、JSON、PDF 和 XLS 数据进行了测试(使用适当的内容类型)
要么为 saveFile() 函数提供数据 blob,要么在 type 设置为空且您的数据位于 [] 之间的情况下动态创建数据 blob
在本例中,我们将只对settings 对象进行字符串化,并正确设置数据类型。
settings = { any_kind_of_object: true };
json_str = JSON.stringify(settings);
saveFile('yourfilename.json', "data:application/json", new Blob([json_str],{type:""}));
function saveFile (name, type, data) {
if (data != null && navigator.msSaveBlob)
return navigator.msSaveBlob(new Blob([data], { type: type }), name);
var a = $("<a style='display: none;'/>");
var url = window.URL.createObjectURL(new Blob([data], {type: type}));
a.attr("href", url);
a.attr("download", name);
$("body").append(a);
a[0].click();
setTimeout(function(){ // fixes firefox html removal bug
window.URL.revokeObjectURL(url);
a.remove();
}, 500);
}
【讨论】: