如何检测文件是否通过FTP上传
我的应用程序正在监视一组用户可以上传文件的文件夹。 当一个file upload完成后,我必须申请一个治疗,但我不知道如何检测文件没有完成上传。
任何方式来检测文件是否还没有被FTP服务器释放?
这个问题没有通用的解决scheme。
某些FTP服务器会locking正在上传的文件,从而阻止您访问文件,而文件仍在上传。 例如IIS FTP服务器就是这样做的。 大多数其他FTP服务器不。 在阻止文件被上传时访问我的答案。
这个问题有一些常见的解决方法(最初是张贴在SFTP文件locking机制中 ,但也与FTP相关):
- 上传完成后,客户端可以上传“完成”文件。 让您的自动化系统等待“完成”文件出现。
- 你可以有一个专门的“上传”文件夹,让客户端(primefaces)将上传的文件移动到“完成”文件夹。 只让您的自动系统看起来“完成”文件夹。
- 对正在上传的文件(“.filepart”)有一个文件命名约定,并让客户端(primefaces地)在上传到最终名称后重命名该文件。 让你的自动化系统忽略“.filepart”文件。
请参阅(我的)文章上传时locking文件/上传到临时文件名为实现此方法的示例。
一些FTP服务器允许你configuration一个挂钩被调用,当上传完成。 你可以利用这个。 例如ProFTPD有一个mod_exec模块 (参见ExecOnCommand
指令)。
我使用ftputil来实现这个解决方法:
- 连接到FTP服务器
- 列出目录的所有文件
- 在每个文件上调用stat()
- 等待N秒
- 对于每个文件:再次调用stat()。 如果结果不同,则跳过该文件,因为它在最后几秒钟被修改。
- 如果stat()结果没有不同,那么下载文件。
这整个ftp-fetching是旧的和过时的技术。 我希望客户下一次使用现代的http API 🙂
这是FTP传输的一个经典问题。 我发现唯一最可靠的方法是发送一个文件,然后发送第二个短的“标记”文件,只是为了告诉收件人第一个完成的传输。 您可以使用文件命名约定,并检查是否存在第二个文件。
您可能会喜欢,并将第二个文件的内容作为第一个文件的校验和。 然后你可以validation第一个文件。 (您没有第二个文件的问题,因为您只是等到文件大小=校验和大小)。
当然这只有在你能让发送者发送第二个文件时才有效。