确定文件是否完整

时间:2011-10-13 21:53:25

标签: ruby

我正在尝试编写一个视频ruby转换器脚本(使用ffmpeg),该脚本依赖于ft文件被绑定到服务器。

我遇到的问题是,当用户上传大文件时,监视脚本(使用rb-inotify)会在完全上传mov之前尝试执行(并运行代码转换器)。

我是一个完整的菜鸟。但是我试图发现是否有办法让我能够确保我的监视脚本在文件完全上传之前不会运行。

我的观看脚本在这里:

watch_me = INotify::Notifier.new
watch_me.watch("/directory_to_my/videos", :close_write) do |directories|
  load '/directory_to_my/videos/.transcoder.rb'
end
watch_me.run

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

仅依靠inotify(7)告诉您何时更新文件不适合告知上传何时“完成” - FTP会话可能会超时并重新启动,例如,由于连接便宜或可靠或可用,允许用户在几天内以块的形式上传文件。 inotify(7)只能看到文件打开,关闭,重命名和访问,但从来没有更高级别的事件“我已经完成了修改此文件”,因为用户会理解它。

我可以想到两种机制:一种是上传最初进入一个目录,并要求用户在上传完成时文件移动到另一个目录中。另一个在客户端上创建一些文件元数据,并使用它来“知道”上传完成的时间。

手动移动已完成的文件

如果您的用户上传到目录ftp/incoming/temporary/,他们可以在需要的连接数上传文件。文件“完成”后,他们可以重命名文件(rename ftp/incoming/temporary/hello.mov ftp/incoming/complete/hello.mov),rb-inotify接口在ftp/incoming/complete/目录中查找文件重命名,然后启动ffmpeg(1)命令

生成元数据

要让转移“完整”,你真的在​​寻找两件事:

  • 两个系统上的文件大小相同。
  • 两个系统上的文件都相同。

由于“相同”很难检查,大多数人都满足于检查文件内容是否通过cryptographic hash function运行,如MD5或SHA-1(或更好,SHA-224, SHA-256,SHA-384或SHA-512)功能。如果你要防止不完整的传输,MD5是相当不错的,但如果你打算将函数的输出用于其他方法,那么使用更强大的函数是明智的。

MD5真的很诱人,因为创建和验证MD5哈希的工具非常普遍:大多数Linux系统上的md5sum(1),大多数BSD系统上的md5(1)(包括OS X)。

$ md5sum /etc/passwd 
c271aa0e11f560af419557ef49a27ac8  /etc/passwd
$ md5sum /etc/passwd > /tmp/sums
$ md5sum -c /tmp/sums
/etc/passwd: OK

md5sum -c命令要求md5sum(1)程序检查哈希文件和文件名的正确性。在单个文件上使用时看起来有点傻,但是当你有几十个或几百个文件时,让软件为你做检查是件好事。例如:http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real-real/MD5SUMS - Mozilla已经发布了860个条目的文件 - 手工检查它们会很累。

因为检查哈希值可能需要很长时间(我的系统需要五分钟才能检查最近未使用的高清长时间视频),所以最好只检查文件大小时的哈希值比赛。修改您的上传工具,以发送有关文件的长度和加密哈希值的一些元数据。当您的rb-inotify脚本看到文件关闭请求时,请检查文件大小,如果大小匹配,请检查加密哈希。如果哈希匹配,则启动ffmpeg(1)命令。

答案 1 :(得分:1)

将文件上传到服务器上的临时目录并将其移动到脚本在传输完成后正在观看的位置似乎更容易。