2011-10-04 139 views
4

我想知道是否有最佳做法来检查上载到您的ftp服务器是否成功。Proftpd验证完成上传

我正在使用的系统有一个上传目录,其中包含上传文件的每个用户的子目录。

这些目录中的文件只是临时性的,它们在处理后会被丢弃。

系统循环遍历这些子目录和其中的新文件,并为每个文件检查它是否被修改了10秒。如果它在10秒内未被修改,则系统假定文件已成功上传。

我不喜欢系统当前处理这些情况的方式,因为它会尝试处理文件,并在文件上传不完整时失败,而不是等待并允许用户恢复上传直到完成。 对于上传时间不长的小文件可能会很好,但如果文件很大,我希望能够恢复上传。

我也不喜欢目录和文件的循环,系统在高cpu使用率下闲置,所以我实现了pyinotify来触发文件写入时的动作。我没有真正看过源代码,我只能假设它比当前的实现更优化(比我所描述的要多得多)。

但是我仍然需要检查文件是否成功上传。

我知道我可以解析xferlog以获得所有完整的上传。像:

awk '($12 ~ /^i$/ && $NF ~ /^c$/){print $9}' /var/log/proftpd/xferlog 

这将使pyinotify不必要的,因为我可以得到的路径,完全和不完全上传,如果我只尾巴日志。

所以我的解决方案是检查我的运行循环中的xferlog,只处理完整的文件。

除非有最佳做法或者只是一个更好的方法来做到这一点?

这种方法的缺点是什么?

我在debian服务器上运行我的应用程序,proftpd安装在同一台服务器上。另外,我无法控制发送文件的客户端。

+0

python脚本的基本目的是什么?它是清理用完的文件,在网页上显示状态还是其他的东西? –

+0

现在阅读,发布一年后,这个问题似乎还不清楚。基本上我想在上载完成后用上传的文件做一些事情。但无法找到一种方式来使用proftpd来保证完整的上传而不阻止FTP REST命令。所以在问题出现的时候,我最终使用iNotify做了一个解决方案,并在写入时验证这些文件。 – JayLev

回答

6

望着proftpd的文档,我看到http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

的HiddenStores指令启用两步文件上传:文件上传 为“.in.filename。”一旦上传完成,将 重命名为“文件名”。这提供了一定程度的原子性,并帮助 防止1)不完整的上传和2)在 仍在上传过程中正在使用的文件。

这应该是“更好的方式”当你拥有的proftpd的控制,因为它处理所有对你的工作要解决的问题 - 你可以认为它没有启动任何.in.文件是完成上传。您也可以安全地删除任何孤儿.in.*文件,在某个地方整理脚本的任何一段时间处于非活动状态。

+0

我看到了,但不幸的是我无法阻止REST命令。当我问这个问题的时候,我最终用pyinotify做了一个解决方案,并在处理之前验证了写入的文件。但是,如果proftpd可以为我处理这个问题,无论是否使用REST或APPE命令都会很好。 – JayLev

+0

当使用'REST'或'APPE'时,我们可以使ProFTPD支持'HiddenStores'功能。但是,有一些可能的后果。当使用'REST'或'APPE'时,存在一个现有的文件;该现有文件需要_copied_作为临时文件。然后,当'STOR'(在'REST'命令之后)或'APPE'完成时,该文件被重新命名,*替换现有文件。如果其他客户端同时修改同一个文件,则可能会有一场比赛 - 谁重命名文件最后获胜。这对于您的需求会是可接受的行为吗? – Castaglia

1

如果您的pure-ftpd安装使用 --with-uploadscript选项进行编译,则可以使用pure-uploadscript。

它用于在每次上传完成后启动指定的脚本。

  1. 设置Call​​UploadScript为 “yes”
  2. 使脚本的命令一样touch /tmp/script.sh
  3. 把代码写在它。在我的例子脚本重命名该文件,并增加了“.completed”文件名前:

    #!/bin/bash fullpath=$1 filename=$(basename "$1") dirname=${fullpath%/*} mv "$fullpath" "$dirname/completed.$filename"

  4. 运行chmod 755 /tmp/script.sh由纯uploadscript在

  5. 使脚本可执行文件,然后运行命令pure-uploadscript -B -r /etc/pure-ftpd/uploadscript.sh

现在/tmp/script.sh将每完成上传后推出。