使用JavaScript可以将数据写入(磁盘上的)文件吗?

14

我是一名初中级程序员,正在尝试使用AJAX技术。在学习JavaScript的过程中,我发现很奇怪的一点是,我所参考的大部分例子都是使用PHP来完成操作。虽然有些人可能会说我“做法不对”或者“JavaScript是客户端语言”等等,但问题依然存在……你能否只使用JavaScript编写文件呢?

9个回答

21

当然可以,这取决于你的JavaScript引擎提供了哪些API对象。但是,很可能你想使用的JavaScript引擎并没有提供此功能。绝对不会有任何主流的Web浏览器允许它。


一些浏览器可以允许它,如果它们支持文件系统访问API - Anderson Green
@AndersonGreen 我不认为这在2009年存在,但这是问题的一个很好的补充。也许提供一个新答案。 - Joel Coehoorn

16

您可以使用Javascript编写Cookies,在较新的浏览器中,您还可以使用SQLite数据库存储客户端数据。但是您不能在磁盘的任意位置存储数据。


6
你可以使用类似Google Gears的工具开发JS应用程序,这些程序能够在本地缓存或数据库中存储数据。但是,你不能读取或写入磁盘的任意区域。(此内容撰写于2009年-Google Gears现已停用
如今,你应该关注HTML5提供的本地存储功能

4

不可以。你可以使用JavaScript创建一个AJAX请求到服务器端处理脚本,但是让JS直接写入磁盘 - 无论是客户端还是服务器端 - 都将是一个巨大的、令人恶心的、惹人注目的、不可原谅的浏览器安全漏洞。


2
简短回答是不行;您不能使用纯JavaScript在浏览器中默认写入本地磁盘文件。您需要一个帮助程序来完成此操作。例如,TiddlyWiki 是一个维基引擎,它只是一个静态的 HTML 文件,但是它可以借助 Java小程序(Tiddly Saver)将自己写入磁盘。

1

Chrome浏览器的下一个版本(v52)通过fetch api + service worker + streams实现了这一点,您现在可以使用标志启用streams...

您可以访问StreamSaver.js以查看如何使用它的示例。

您可以像这样做:

const writeStream = fs.createWriteStream('filename.txt')
const encoder = new TextEncoder
let data = 'a'.repeat(1024)
let uint8array = encoder.encode(data + "\n\n")

writeStream.write(uint8array)
writeStream.close()

或者直接查看演示:https://jimmywarting.github.io/StreamSaver.js/example.html


1
你可以在Windows脚本宿主中实现。

0

不,JavaScript 无法访问文件系统,这是浏览器中的安全限制。唯一的方法是使用 ActiveX,但这样你就只能使用 IE。

编辑: 如上所述,如果您的引擎允许,则可能是可能的,但我不知道有哪个浏览器引擎(我认为您正在为其编写)会允许您这样做。


ActiveX 不是唯一的选择。您可以使用 Java,而不仅仅局限于 IE。 - Ates Goral
1
我们在这里谈论的是Javascript,而不是Java,而实现他所要求的最常见方法是使用ActiveX,这将限制您使用IE。 - Sam Cogan
3
ActiveX比Java更“JavaScript”的原因在于,它只是将另一个对象嵌入到HTML文件中,让JavaScript将其用作辅助工具。 - Ates Goral

0

如果您只需要让用户通过浏览器下载对话框下载文件(.txt.csv,图像和其他文件),您可以使用data URIs<a href=... download=.../>标签。

例如(针对文本文件):

<a href="data:text/plain;charset=utf-8,TEXT_HERE" download="filename.txt"> Click to download </a>

您也可以使用JavaScript设置属性hrefdownload,并使用element.click()触发下载。

然而,这种方法不能在用户确认文件下载对话框之前写入文件。


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