如何使用JavaScript在客户端保存文件?

5
我想将一个JSON对象保存到客户端文件中以便将来使用,我尝试了以下代码:
window.open("data:text/json;charset=utf-8," + escape(JSON.stringify(obj)));
它可行!但是它会询问用户文件的位置和名称。我希望用户完全不知道正在保存某些东西以备将来使用,或者至少最小化用户点击次数。
如何在window.open()中静态地设置文件名和位置?
谢谢。
编辑:
为了明确,“我不存储任意或不需要的数据。所有用户都是注册用户。”在正常情况下,我不会将任何东西存储在本地。但是,如果网络在提交表单时不可用,我想存储一些JSON对象。
一个显而易见的解决方案是使用Cookie。由于Cookie可能会因用户浏览器设置而被意外删除,因此我需要一种方法来保存数据直到网络恢复。最好具有跨浏览器的支持。

4
Java不是JavaScript,它们是完全独立的编程语言。 - Pointy
此外,在浏览器环境中,您不能强制将文件保存在客户端计算机上。这是一项相当明显的安全措施。 - Pointy
2
JSON 的正确 MIME 类型是 application/json ;) - Quasdunk
@Quasdunk 感谢您指出正确的 MIME 类型,点赞 +1。 - Amit
2
你所建议的做法将会带来重大的安全风险。更不用说,每当你访问互联网上的任何页面时,数千个文件就会堆积在你的硬盘驱动器上,这将会非常烦人。而且,如果不是在Windows机器上,你怎么能够写入到C:\Windows\System32\呢? - flesk
显示剩余2条评论
6个回答

7
如果您想持久保存数据,那么请使用存储API,不要试图操作用户的文件系统。

1
+1,还可以尝试使用store.js——一个localStorage包装器。 - Daniel

4

你不能这样做,这是客户端安全问题。


可以使用服务工作者在客户端上保存文件,这是在撰写此问题时不存在的。点击此处了解更多信息。 - Anderson Green

2

FSO.js 封装了临时/持久 FileSystem API,可以让您轻松地读写文件...目前只有 Chrome 支持,但规范正在快速发展。 :)


这个项目所基于的文件系统API已经被弃用,并且大多数主流浏览器不再支持。此存储库仅用于档案目的。https://github.com/keithwhor/FSO.js/ - Aryeh Armon

2
我想要实现跨浏览器支持的价值,即使用户更改了浏览器,他/她也应该能够从上次停止的地方继续。我正在使用JSON对象存储信息。
我认为用户不希望以这种方式与同一台机器上的其他浏览器共享信息。此外,我怀疑很少有用户经常更改其浏览器,因此不需要像这样侵犯隐私的功能。您应该考虑将信息存储在服务器上(通过强制用户注册或使用常见账户,如OpenID、Google、Facebook等),或者在客户端设置cookie或使用上述存储技术。
如果您真的想将存储的信息限制在同一台机器上的浏览器中,并且不想允许同一用户在不同机器上访问,那么可以看看LSO(“Flash cookie”),它们似乎是独立于浏览器保存的。您不需要任何用户确认即可存储LSO。
更新:Flash不再像过去那样得到浏览器的支持,现在也不被广泛使用,因此LSO不再是一个好的选择。

用户将已经是我网站的注册用户...只有在暂时没有网络可用时,我才存储数据...对于所有其他情况(即当网络可用时),我不存储任何东西...无论如何,谢谢。 - Amit

2

这个项目所基于的文件系统API已经被弃用,并且大多数主流浏览器不再支持。此存储库仅用于档案目的。https://github.com/keithwhor/FSO.js/ - Aryeh Armon

1
正如评论中已经提到的,由于明显的安全原因,未经用户明确同意是不可能实现的。但是,也如评论中所提到的,您可以将信息存储在 cookie 中,当用户返回时就可以检索到该信息。
类似以下代码即可实现此功能:
document.cookie="cookie_name="+required_value+"; expires=Monday, 04-Dec-2011 05:00:00 GMT";

显然,过期时间将与您需要信息持久的时间一样长。

希望能帮到你。


我已经在cookie中存储了值...实际上,我正在尝试将其写入文件,以防用户下次更改浏览器或清除cookie的情况... - Amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接