在我的项目中,我有一个文件上传功能。文件通过FTP上传。我需要配置一个侦听器,它将检查新文件并仅在文件上载完成时调用脚本。因为如果我在检测到新文件后立即运行此脚本,它可以开始处理未完全上载的文件,这将导致错误。任何人都可以告诉LINUX这是否可行,我该怎么做?
答案 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
显示了如何检测正在响应的客户端命令。您可以检查STOR
或STOU
以及回复代码426
或551
以检测上传失败。
但是,如果客户端应用决定将传输视为文件只是比它短,那么这可能无法检测到客户端故意终止的上传。在无意中断连接的情况下,我认为回复代码检查将起作用。测试可能是杀死客户端应用程序,或者关闭客户端计算机的网络接口。
要处理成功上传(您的原始问题),您可以改为查找成功回复代码,即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哈希值的校验和文件,并将其与文件一起发送。这将允许您在对文件执行任何操作之前针对哈希验证内容。