如何检测通过FTP上载文件

时间:2015-03-24 16:37:41

标签: file-upload ftp upload

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

是否可以检测FTP服务器是否尚未发布文件?

4 个答案:

答案 0 :(得分:16)

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

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


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

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

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

答案 1 :(得分:5)

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

  1. 连接到ftp服务器
  2. 列出目录的所有文件
  3. 在每个文件上调用stat()
  4. 等待N秒
  5. 对于每个文件:再次调用stat()。如果结果不同,则跳过此文件,因为它在最后几秒内被修改。
  6. 如果stat()结果没有差异,则下载文件。
  7. 这整个ftp-fetching是旧的和过时的技术。我希望客户下次使用现代的http API: - )

答案 2 :(得分:2)

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

我希望它将对某人有所帮助。

答案 3 :(得分:0)

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

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

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