如何检测通过FTP上载文件

问题描述 投票:12回答:4

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

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

file-upload ftp upload
4个回答
17
投票

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

某些FTP服务器锁定正在上载的文件,阻止您访问该文件,同时仍在上载文件。例如,IIS FTP服务器就是这样做的。大多数其他FTP服务器没有。请参阅我在Prevent file from being accessed as it's being uploaded的回答。


这个问题有一些常见的解决方法(最初发布在SFTP file lock mechanism,但也与FTP相关):

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

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


5
投票

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

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

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


2
投票

如果您正在读取特定扩展名的文件,请使用WINSCP进行文件传输。它将创建一个扩展名为.filepart的临时文件,一旦完全传输文件,它将转向实际的文件扩展名。

我希望,它会帮助某人。


0
投票

这是FTP传输的典型问题。我发现的唯一可靠的方法是发送文件,然后发送第二个简短的“标记”文件,告诉收件人第一个传输完成。您可以使用文件命名约定,只检查第二个文件是否存在。

您可能会喜欢并将第二个文件的内容作为第一个文件的校验和。然后你可以验证第一个文件。 (你没有第二个文件的问题,因为你只是等到文件大小=校验和大小)。

当然,这只有在您可以让发件人发送第二个文件时才有效。

© www.soinside.com 2019 - 2024. All rights reserved.