如何检测通过FTP上载文件

use*_*898 14 ftp upload file-upload

我的应用程序正在监视用户可以上传文件的一组文件夹.文件上传完成后,我必须应用处理,但我不知道如何检测文件还没有完成上传.

有没有办法检测FTP服务器是否还没有发布文件?

Mar*_*ryl 18

这个问题没有通用的解决方案.

某些FTP服务器锁定正在上载的文件,阻止您访问该文件,同时仍在上载文件.例如,IIS FTP服务器就是这样做的.大多数其他FTP服务器没有.请参阅我的答案,防止文件在上传时被访问.

这个问题有一些常见的解决方法(最初发布在SFTP文件锁机制中,但也与FTP相关):

  • 上传完成后,您可以让客户端上传"完成"文件.使您的自动系统等待"完成"文件出现.
  • 您可以拥有专用的"上传"文件夹,并让客户端(原子地)将上传的文件移动到"完成"文件夹.使您的自动系统仅查看"完成"文件夹.
  • 对上载的文件(".filepart")具有文件命名约定,并在上载到其最终名称后让客户端(原子地)重命名该文件.使您的自动系统忽略".filepart"文件.
    请参阅(我的)文章在上载/上传到临时文件名时锁定文件以获取实现此方法的示例.
  • 一个严重的黑客是定期检查文件属性(大小和时间)并考虑上传完成,如果属性在一段时间间隔内没有改变.

某些FTP服务器允许您在上载完成时配置要调用的挂钩.你可以利用它.例如,ProFTPD有一个mod_exec模块(参见ExecOnCommand指令).


gue*_*tli 5

我使用ftputil来实现这个解决方法:

  1. 连接到ftp服务器
  2. 列出目录的所有文件
  3. 在每个文件上调用stat()
  4. 等N秒
  5. 对于每个文件:再次调用stat().如果结果不同,则跳过此文件,因为它在最后几秒内被修改.
  6. 如果stat()结果没有不同,则下载文件.

这整个ftp-fetching是旧的和过时的技术.我希望客户下次会使用现代的http API :-)