我想知道是否有最佳实践来检查上传到您的ftp服务器是否成功.
我正在使用的系统有一个上传目录,其中包含上传文件的每个用户的子目录.
这些目录中的文件只是临时的,一旦处理就会丢弃.
系统循环遍历每个子目录及其中的新文件,并为每个文件检查它是否被修改了10秒.如果它未被修改10秒钟,则系统假定文件已成功上载.
我不喜欢系统当前处理这些情况的方式,因为它会尝试处理文件并在文件上传不完整时失败,而不是等待并允许用户恢复上传直到完成.
对于没有花费大量时间上传的小文件可能没问题,但如果文件很大,我希望能够恢复上传.
我也不喜欢目录和文件的循环,系统在高CPU使用率下闲置,所以我已经实现了pyinotify来在写入文件时触发动作.我还没有真正看过源代码,我只能假设它比当前的实现更优化(比我描述的更多).
但是我仍然需要检查文件是否已成功上传.
我知道我可以解析xferlog以获得所有完整的上传.喜欢:
awk '($12 ~ /^i$/ && $NF ~ /^c$/){print $9}' /var/log/proftpd/xferlog
这将使pyinotify不必要,因为如果我只拖尾日志,我可以获得完整和不完整上传的路径.
所以我的解决方案是检查运行循环中的xferlog,只处理完整的文件.
除非有最佳实践或只是更好的方法来做到这一点?
这种方法的缺点是什么?
我在debian服务器上运行我的应用程序,proftpd安装在同一台服务器上.此外,我无法控制发送文件的客户端.
解决方法:
看看proftpd文档,我看到http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html
The HiddenStores directive enables two-step file uploads: files are
uploaded as “.in.filename.” and once the upload is complete, renamed
to just “filename”. This provides a degree of atomicity and helps
prevent 1) incomplete uploads and 2) files being used while they’re
still in the progress of being uploaded.
当你控制proftpd因为它为你处理所有的工作时,这应该是解决问题的“更好的方法” – 你可以假设任何不启动的文件.in.是一个完整的上传.您还可以在某个整理脚本中的任意一段时间不活动后安全地删除任何孤立的.in.*文件.