Proftpd验证完整上传

时间:2011-10-04 07:26:53

标签: python ftp file-transfer proftpd

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

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

这些目录中的文件只是暂时的,一旦处理就会丢弃。

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

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

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

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

我知道我可以解析xferlog以获取所有完整的上传内容。喜欢:

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

这会使pyinotify变得不必要,因为如果我只拖尾日志,我可以获得完整和不完整上传的路径。

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

除非有最佳做法或只是更好的方法吗?

这种方法的缺点是什么?

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

2 个答案:

答案 0 :(得分:7)

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

  

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

当您控制proftpd因为它处理所有工作时,这应该是解决问题的“更好方法” - 您可以假设任何未启动.in.的文件都是完成上传。在某个整洁的脚本中,您可以安全地删除任何孤立的.in.*文件。

答案 1 :(得分:0)

如果编译了纯ftpd安装,则可以使用pure-uploadscript --with-uploadscript选项。

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

  1. 将CallUploadScript设置为" yes"
  2. 使用touch /tmp/script.sh
  3. 等命令制作脚本
  4. 将代码写入其中。在我的示例中,脚本重命名文件并添加" .completed"在文件名之前:

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

  5. 运行chmod 755 /tmp/script.sh以使脚本可执行pure-uploadscript

  6. 然后运行命令pure-uploadscript -B -r /etc/pure-ftpd/uploadscript.sh

  7. 现在/tmp/script.sh将在每次完成上传后启动。