在我的项目中,我具有文件上传功能。文件通过FTP上传。我需要配置一个侦听器,该侦听器将检查新文件并仅在文件上传完成后才调用脚本。因为如果我在检测到新文件后立即运行此脚本,它将开始处理未完全上载的文件,这将导致错误。谁能说出这在LINUX上是否可行,我该怎么办?
我尝试使用inotify,事件代码为IN_CLOSE_WRITE。
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
显示了如何检测正在响应的客户端命令。您可以检查STOR
或STOU
并回复代码426
或551
以检测失败的上传。
但是,如果客户端应用决定将传输视为短于文件,则无法检测到客户端故意终止的上传。在无意间断开连接的情况下,我认为回复代码检查将起作用。测试可能是杀死客户端应用程序,或关闭客户端计算机的网络接口。
要处理成功的上传(您的原始问题),您可以查找成功的回复代码,即226
。
看看inotify
我一直在寻找相同的东西,偶然发现了具有上传脚本功能的pureftpd。听起来确实需要什么。在此处找到详细信息:http://www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html
我已经使用了Proftpd的HiddenStores功能。通过在文件中添加.in.filename.ext前缀,可以隐藏传输中的文件,直到文件上传完成。然后,您的进程可以安全地列出完整文件的目录。
[旧的,但仍然值得添加好主意。