5

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

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

这些目录中的文件只是临时的,一旦处理它们就会被处理掉。

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

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

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

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

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

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

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

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

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

这种方法有什么缺点?

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

4

2 回答 2

8

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

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

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

于 2012-09-09T13:47:04.510 回答
0

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

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

  1. 将 CallUploadScript 设置为“是”
  2. 使用类似的命令制作脚本touch /tmp/script.sh
  3. 在里面写代码。在我的示例中,脚本重命名文件并在文件名前添加“.completed”:

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

  4. 通过pure-uploadscript运行chmod 755 /tmp/script.sh使脚本可执行

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

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

于 2015-03-10T01:17:07.587 回答