【问题标题】:Manipulating the local file system with browser-based JavaScript and Node使用基于浏览器的 JavaScript 和 Node 操作本地文件系统
【发布时间】:2018-03-10 02:54:44
【问题描述】:

我正在制作一个需要允许用户从浏览器与文件系统交互的项目。我有很多编写客户端 JavaScript 的经验,也有很多编写 Node 脚本的经验,比如网络抓取、数据分析和文件系统工作。但是这个项目将允许用户在浏览器中更改内容,然后将数据保存在本地(最终保存到 Web 服务器)——我对此没有经验。

我已经安装了 browserifybrowserify-fs 以在浏览器中使用 Node 的 fs 模块,并使用 browserify-fs README 中的示例创建一个目录,向其中写入文件,然后读取该文件:

var fs = require('browserify-fs');

fs.mkdir("/home", function(err){
    if (err) throw err;

    fs.writeFile("/home/hello-world.txt", "Hello world!", function(err) {
        if (err) throw err;

        fs.readFile("/home/hello-world.txt", "utf-8", function(err, data) {
            if (err) throw err;

            console.log(data);
        });
    });
});

在它记录“Hello world!”的意义上,这个“有效”。在控制台中。但据我所知,它不会在本地创建目录或保存文件。我有一种模糊的感觉,它会将这些东西暂时保存在浏览器中,并且当我离开时它们会被删除。但我想实际创建一个目录并在本地保存一个文件。我可以单独使用 JavaScript 做到这一点吗?有没有关于如何在基于浏览器的 JavaScript 和 Node 之间“闭环”的好教程?

更新

我接受了 T.J. Crowder 的回应——ExpressJS 确实使 JavaScript 中的客户端-服务器通信相对简单。我现在正在做的是,我将用户的条目保存到一个全局 JSON 对象中。当用户单击“保存”按钮时,我使用字符串化 JSON 更新 <form> 元素中隐藏的 <input> 元素的值。然后我提交表格,Express 的app.post() 加上模块body-parser 给我req.body 中的所有内容。然后我就可以进行正常的Node文件系统操作了。

【问题讨论】:

  • 想象一下 JavaScript 是否可以访问文件系统。任何人都可以创建一个网站,对任何访问它的人的计算机造成严重破坏。如果你想在本地存储东西,请使用localStorage
  • browserify-fs,根本不是你想要的……
  • 不幸的是,您对基于浏览器的 javascript 的唯一文件访问是使用带有文件类型的 INPUT 标记,它询问用户什么文件。 local-storage / IndexedDb 等可用于存储数据。如果你想要更多的控制,你可以创建一个嵌入 webkit / node 系统的应用程序。这就是 Atom.io 之类的东西使用等。尝试-> electron.atom.io

标签: javascript node.js


【解决方案1】:

自然,浏览器托管的 JavaScript 无法访问用户机器的文件系统(目前;有一天,可能会发生某种沙盒访问——last attempt 失败,但这并不意味着下一个必须这样做) .

所以要做到这一点,你需要两块:

  1. 一个浏览器,它与用户一起完成 UI。

  2. 一个节点片段,它在用户的机器上运行(因此可以访问文件系统),浏览器片段用来执行实际的文件操作。

可能最简单的片段交互方式是 HTTP,您可以使用 ExpressJS 轻松支持它。

例如,如果用户想要删除一个文件:

  1. 用户点击某事说“删除此文件”
  2. 浏览器 JavaScript 通过 ajax 通过 HTTP 将命令发送到 Node 进程
  3. 节点进程执行删除并报告成功/失败
  4. 浏览器 JavaScript 显示结果

【讨论】:

  • ExpressJS 完美地做到了这一点。谢谢!顺便说一句,一本学习基础知识的好书是 O'Reilly 的 Todd Brown 的 Web Development with Node and Express。
【解决方案2】:

您不能仅在 Javascript 中执行此操作。由于安全原因,在浏览器上运行的 Javascript 还没有足够的权限(有提议)。

https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API/Introduction#restrictions

由于文件系统是沙盒化的,因此 Web 应用无法访问其他应用的文件。您也无法读取或写入文件到用户硬盘上的任意文件夹(例如,我的图片和我的文档)。

【讨论】:

  • “你不能只用 Javascript 做到这一点。”当然可以。
  • @T.J.Crowder 我很想知道如何使用纯 javascript 访问文件系统(仅限浏览器端)。如果你有一个库名,那就太好了
  • 你说的不是这个。你说“你不能纯粹在Javascript中做到这一点。”是的,你可以——使用Node(或任何其他非浏览器JavaScript环境),而不是在浏览器中。 OP 甚至在问题中提及节点。
  • 据我所知,OP 还提到结果最终会上传到服务器,这表明他正在寻找一种方法来使用纯浏览器内客户端来执行此操作。
  • 我不是在寻找一种使用纯浏览器内客户端的方法。 T.J.克劳德的回应​​非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2013-05-02
  • 2012-04-15
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多