协调nodejs中的文件系统活动

时间:2012-01-17 22:18:47

标签: javascript node.js

协调对node.js中文件的访问的最佳做法是什么?

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

当您使用文件阅读器将文件流式传输到内存中时,您需要将其分解为块并散列块。然后向服务器发送所有文件的散列块。将文件分成块并散列那些单独的块而不是整个文件的内容是很重要的,否则客户端可能会发送一个哈希并上传整个不同的文件。

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

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

答案 1 :(得分:0)

我在HackerNews上发现了这个问题,回应了有人抱怨node.js中的一些相同的事情。为了完整起见,我会把它放在这里。这允许我至少锁定node.js中的一些文件写入,就像我想要的那样。

  

IsaacSchlueter 4小时前|链路

     

如果您将打开的标记作为a传递,则可以使用O_EXCL打开文件   数。 (你可以在require(“常量”)上找到它们,并且它们需要   二进制“或”在一起。)这没有记录。它应该是。它   也许应该以更清洁的方式暴露。剩下的大部分   你所描述的是需要抛光和改进的API。   不过,此时边界已明确界定。我们可能   此时不会添加另一个内置模块,也不会大幅扩展   他们中的任何一个都可以做到。 (我不认为seek()戏剧性,它只是   鉴于JavaScript烦人的数字问题,我很难做到正确。)