javascript - 协调nodejs中的文件系统事件

标签 javascript node.js

在 node.js 中协调文件访问的最佳实践是什么?

我正在尝试为可恢复的超大文件 (10sGB) 编写一个基于 http 的文件 uploader 。我试图找出最好的方法是处理两个试图同时上传同一个文件的人......我也试图提前考虑 node.js 的多个副本的可能性http 服务器在负载均衡器后面运行,这意味着捕获重复上传不能仅依靠代码本身。

例如,在 Python 中,您可以通过将正确的标志传递给 open() 调用来强制原子创建来创建文件。不确定默认的 node.js 打开新文件是否是原子的。

我想到的另一个选择,但真的不想追求,是使用带有支持原子事务的异步驱动程序的数据库来跟踪此状态...

最佳答案

为了知道是否有多个用户上传同一个文件,您必须以某种方式识别这些文件。散列最适合这个。首先,在客户端散列整个文件以识别它。告诉服务器文件的哈希值,如果服务器上已经有具有相同哈希值的文件,则该文件已经上传或正在上传。

由于这是一个 http 文件服务器,您可能希望用户从浏览器上传文件。您可以使用 File Reader API 通过浏览器获取文件的内容.不幸的是截至目前this isn't widely supported .您可能必须使用 flash 之类的东西才能使其在其他浏览器中工作。

当您使用文件读取器将文件流式传输到内存中时,您会希望将其分成 block 并对 block 进行哈希处理。然后向服务器发送文件的所有散列 block 。将文件分成 block 并对这些单独的 block 而不是整个文件的内容进行哈希处理很重要,否则客户端可能会发送一个哈希值并上传整个不同的文件。

在收到哈希值并与其他文件的哈希值进行比较后,发现其他人当前正在上传同一文件,然后服务器决定哪个用户可以上传文件的哪些 block 。服务器然后告诉正在上传的客户端它想要从它们那里得到什么 block ,然后客户端上传它们相应的 block 。

当每个 block 上传完毕后,它会在服务器上重新散列并与原始散列数组进行比较,以验证用户上传的文件是否正确。

关于javascript - 协调nodejs中的文件系统事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902525/

相关文章:

node.js - 一个 Redis 连接可以为一千个并发用户提供服务吗?

javascript - 用户根据提示设置背景颜色和字体

node.js - Nodejs Vertica 以 json 形式返回查询

javascript - 从 dom 中隐藏输入值属性

javascript - 将 HTML 表导出到 Excel,包括文本区域和下拉选定值

node.js - Nodejs bcrypt 比较无法正常工作

javascript - 有没有办法使用javascript和 Node 模块(oracledb)将csv导入到oracle数据库?

javascript - Nodejs 串联运行函数

javascript - 返回innerHTML 作为 UL

javascript - jQuery - 在 slideDown 上滚动到 div 的底部