File upload 如何检测通过FTP上载的文件

File upload 如何检测通过FTP上载的文件,file-upload,ftp,upload,File Upload,Ftp,Upload,我的应用程序正在监视一组用户可以上传文件的文件夹。当文件上传完成时,我必须进行处理,但我不知道如何检测文件尚未完成上传 有没有办法检测FTP服务器是否还没有发布文件?这个问题没有通用的解决方案 某些FTP服务器锁定正在上载的文件,阻止您在文件仍在上载时访问该文件。例如,iisftp服务器就是这样做的。大多数其他FTP服务器不这样做。请参阅我的答案 该问题有一些常见的解决方法(最初发布在中,但也与FTP相关): 上传完成后,您可以让客户端上传“完成”文件。让您的自动化系统等待“完成”文件出现

我的应用程序正在监视一组用户可以上传文件的文件夹。当文件上传完成时,我必须进行处理,但我不知道如何检测文件尚未完成上传


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

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

某些FTP服务器锁定正在上载的文件,阻止您在文件仍在上载时访问该文件。例如,iisftp服务器就是这样做的。大多数其他FTP服务器不这样做。请参阅我的答案


该问题有一些常见的解决方法(最初发布在中,但也与FTP相关):

  • 上传完成后,您可以让客户端上传“完成”文件。让您的自动化系统等待“完成”文件出现

  • 您可以有一个专用的“上载”文件夹,并让客户端(原子地)将上载的文件移动到“完成”文件夹。让您的自动化系统只查看“完成”文件夹

  • 对正在上载的文件有一个文件命名约定(“.filepart”),并让客户端(原子地)在上载后将文件重命名为最终名称。使您的自动化系统忽略“.filepart”文件

    有关实现此方法的示例,请参见(我的)文章

    此外,一些FTP服务器内置了此功能。例如,ProFTPD及其子系统

  • >P>一个粗略的黑客是定期检查文件属性(大小和时间),并考虑上传完成,如果属性没有改变一段时间间隔。< /P>
  • 您还可以利用以下事实:某些文件格式具有清晰的文件结尾标记(如XML或ZIP)。所以你知道,当你下载一个不完整的文件时



某些FTP服务器允许您在上传完成时配置要调用的钩子。你可以利用这一点。例如,ProFTPD有一个(请参阅
ExecOnCommand
指令)。

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

某些FTP服务器锁定正在上载的文件,阻止您在文件仍在上载时访问该文件。例如,iisftp服务器就是这样做的。大多数其他FTP服务器不这样做。请参阅我的答案


该问题有一些常见的解决方法(最初发布在中,但也与FTP相关):

  • 上传完成后,您可以让客户端上传“完成”文件。让您的自动化系统等待“完成”文件出现

  • 您可以有一个专用的“上载”文件夹,并让客户端(原子地)将上载的文件移动到“完成”文件夹。让您的自动化系统只查看“完成”文件夹

  • 对正在上载的文件有一个文件命名约定(“.filepart”),并让客户端(原子地)在上载后将文件重命名为最终名称。使您的自动化系统忽略“.filepart”文件

    有关实现此方法的示例,请参见(我的)文章

    此外,一些FTP服务器内置了此功能。例如,ProFTPD及其子系统

  • >P>一个粗略的黑客是定期检查文件属性(大小和时间),并考虑上传完成,如果属性没有改变一段时间间隔。< /P>
  • 您还可以利用以下事实:某些文件格式具有清晰的文件结尾标记(如XML或ZIP)。所以你知道,当你下载一个不完整的文件时


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

我使用它来实现以下工作:

  • 连接到ftp服务器
  • 列出目录中的所有文件
  • 对每个文件调用stat()
  • 等N秒
  • 对于每个文件:再次调用stat()。如果结果不同,则跳过此文件,因为它是在最后几秒钟内修改的
  • 如果stat()结果相同,则下载该文件
  • 整个ftp抓取都是过时的老技术。我希望客户下次使用现代http API:-)

    我使用它来实现以下工作:

  • 连接到ftp服务器
  • 列出目录中的所有文件
  • 对每个文件调用stat()
  • 等N秒
  • 对于每个文件:再次调用stat()。如果结果不同,则跳过此文件,因为它是在最后几秒钟内修改的
  • 如果stat()结果相同,则下载该文件

  • 整个ftp抓取都是过时的老技术。我希望客户下次会使用现代http API:-)

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

    您可能会想入非非,将第二个文件的内容设置为第一个文件的校验和。然后您可以验证第一个文件。(第二个文件没有问题,因为您只需等待文件大小=校验和大小)


    当然,这只有在你能让发送者发送第二个文件的情况下才有效。

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

    您可能会想入非非,将第二个文件的内容设置为第一个文件的校验和。然后您可以验证第一个文件。(第二个文件没有问题,因为您只需等待文件大小=校验和大小)

    当然,这只有在你能让发送者发送的情况下才有效