LINUX:如何检测 ftp 文件上传完成
Posted
技术标签:
【中文标题】LINUX:如何检测 ftp 文件上传完成【英文标题】:LINUX: how to detect that ftp file upload is finished 【发布时间】:2011-03-05 11:23:58 【问题描述】:在我的项目中,我有一个文件上传功能。文件通过 FTP 上传。我需要配置一个侦听器来检查新文件并仅在文件上传完成时调用脚本。因为如果我在检测到新文件后立即运行此脚本,它可以开始处理未完全上传的文件,这将导致错误。谁能告诉这在 LINUX 上是否可行,我该怎么做?
【问题讨论】:
你能指定你想使用什么语言吗? 【参考方案1】:我会尝试使用inotify,事件代码为 IN_CLOSE_WRITE。
【讨论】:
+1 ,但值得一提的是,一些 ftp 服务器会创建一个隐藏的临时文件来接收数据,直到 xfer 完成。 IE。.foo-ftpupload-2837948723
与目标文件在同一上传路径中,因此您需要确保您的事件循环可以处理该问题,并且在文件实际重命名之前不会触发任务。
感谢您的建议。我尝试了 inotify,但我发现它会在文件未完全上传但连接丢失的情况下触发 IN_CLOSE_WRITE(例如,如果我停止上传或关闭 FTP 客户端)。所以我相信没有办法检测完全上传的文件而不是使用 HTTP。这是正确的吗?
在这种情况下要查找的事件是close_write
。【参考方案2】:
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
。
【讨论】:
【参考方案3】:看看inotify
虽然它不会自动监视子目录,所以如果您需要监控许多 ftp 帐户(或者 FTP 客户端想要创建一个子目录并上传到那里),您需要自己处理。
【讨论】:
正确。对于正在监视的任何守护程序,建议使用广度优先搜索(类似于ftw()
,但广度优先),这样在启动时不会错过任何子目录。【参考方案4】:
我在寻找同样的东西,偶然发现了具有上传脚本功能的 pureftpd。听起来正是需要的。在此处找到详细信息:http://www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html
【讨论】:
【参考方案5】:我使用了 Proftpd 的 HiddenStores 功能。它通过在传输中的文件添加前缀 .in.filename.ext 来隐藏它们,直到它们完成上传。然后,您的进程可以安全地列出已完成文件的目录。
http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html
【讨论】:
【参考方案6】:一个旧的,但仍然值得添加好的想法。
基本上,由于互联网的性质,很难检测到一个文件就是您想要的整个文件。这是我要做的:
让客户端执行上传到临时目录,我们称之为“上传”,一旦放置(上传)完成,客户端应该重命名文件以将其放置在另一个目录中,我们称之为“准备好”。如果客户端在传输过程中遇到问题,文件将永远不会出现在“就绪”目录中。所以没有部分上传。
客户端应处理上传错误并重试。大多数客户端将继续上传文件而无需再次发送整个文件。
在服务器端,您只需要对“就绪”目录中的文件进行操作,并监视“上传”目录中的长期文件。
为了额外的保证,csender 可以生成一个包含文件内容的 sha256 哈希值的校验和文件,并将其与文件一起发送。这将允许您在对文件执行任何操作之前根据哈希验证内容。
【讨论】:
以上是关于LINUX:如何检测 ftp 文件上传完成的主要内容,如果未能解决你的问题,请参考以下文章