LINUX:如何检测ftp文件上传完成

时间:2010-06-18 14:41:35

标签: linux upload ftp

在我的项目中,我有一个文件上传功能。文件通过FTP上传。我需要配置一个侦听器,它将检查新文件并仅在文件上载完成时调用脚本。因为如果我在检测到新文件后立即运行此脚本,它可以开始处理未完全上载的文件,这将导致错误。任何人都可以告诉LINUX这是否可行,我该怎么做?

6 个答案:

答案 0 :(得分:12)

我尝试使用inotify,事件代码IN_CLOSE_WRITE。

答案 1 :(得分:6)

Apache“Mina”ftp服务器(java)可能能够做到你想要的,包括检测上传失败,如上所述here

引用:

  

从Ftplet.afterCommand,你应该   能够看看答复。对于   那些失败的传输就是FtpServer   可以检测到(导致...   SocketException或IOException)这个   应该像426或   551。

Ftplet概述here,包括回复代码。

afterCommand方法签名:

FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply)

您在覆盖方法中检查reply.getCode()。您应该继承DefaultFtplet,而不是从头开始实现Ftplet接口。

请注意,DefaultFtplet::afterCommand显示了如何检测正在响应的客户端命令。您可以检查STORSTOU以及回复代码426551以检测上传失败。

但是,如果客户端应用决定将传输视为文件只是比它短,那么这可能无法检测到客户端故意终止的上传。在无意中断连接的情况下,我认为回复代码检查将起作用。测试可能是杀死客户端应用程序,或者关闭客户端计算机的网络接口。

要处理成功上传(您的原始问题),您可以改为查找成功回复代码,即226

答案 2 :(得分:3)

查看inotify

它不会自动监视子目录,因此如果您需要监视许多ftp帐户(或FTP客户端想要创建子目录并在那里上传),您需要自己处理。

答案 3 :(得分:1)

我一直在寻找同样的东西,偶然发现了pureftpd,它有一个上传脚本功能。听起来确实需要什么。在此处找到详细信息:http://www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html

答案 4 :(得分:0)

我使用了Proftpd的HiddenStores功能。它通过在.in.filename.ext前添加前缀来保持传输中的文件,直到它们完成上载。然后,您的进程可以安全地列出已完成文件的目录。

http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

答案 5 :(得分:0)

一个古老的但仍然值得添加好的想法的人。

基本上,由于Internet的特性,很难检测到文件就是您想要的整个文件。这是我要做的:

让客户端执行上载到暂存目录的操作,我们将其称为“上传”,放置(上传)完成后,客户端应将文件重命名以将其放置在另一个目录中,我们将其称为“就绪”。如果客户端在传输过程中出现问题,该文件将永远不会出现在“就绪”目录中。因此没有部分上传。

客户端应处理上载错误,然后重试。大多数客户将继续上传文件,而无需再次发送整个文件。

在服务器端,您只需要对“就绪”目录中的文件执行操作,并监视“上传”目录中的长期文件。

为进一步保证,csender可以生成一个包含文件内容的sha256哈希值的校验和文件,并将其与文件一起发送。这将允许您在对文件执行任何操作之前针对哈希验证内容。