APPE FTP命令传输完成检测服务器端

时间:2012-05-11 14:27:07

标签: ftp inotify pyinotify

我有一个通过FTP处理传入文件的服务。

在我安装Proftpd的Debian服务器上,我使用iNotify事件来确定文件传输何时完成,我可以开始使用它。

一旦不再写入文件,就会触发事件。

在我发现新的尼康D4相机和WT-5无线发射器使用APPE FTP命令发送文件之前,这一功能完美无缺。

从我读过的内容来看,似乎APPE FTP命令以数据块的形式发送文件,这些数据块在第一个块创建文件后附加到服务器上的现有文件中。

然而,这导致几个iNotify事件被触发,因为文件被多次而不是一次,直到连接关闭。

由于文件在文件完成之前处理,因此一旦处理就会导致错误。我总是在处理后删除该文件。

由于我的这项服务必须保持快速处理传入的文件我真的很喜欢iNotify这个解决方案,并且如果文件大小在n秒内保持不变或者确定文件传输是否为完整。

我的问题是:有没有办法确定文件传输是否实际完成而无需检查文件大小或比较上次修改日期?

我试图在proftpd中找到一种方法,但没有用。

xferlog表示同一文件已多次完成:

Fri May 11 14:15:41 2012 2 host-95-199-17-243.mobileonline.telia.com 131072 /var/app/incoming/file.JPG b _ i r auser ftp 0 * c
Fri May 11 14:15:43 2012 2 host-95-199-17-243.mobileonline.telia.com 262144 /var/app/incoming/file.JPG b _ i r auser ftp 0 * c
Fri May 11 14:15:47 2012 3 host-95-199-17-243.mobileonline.telia.com 385624 /var/app/incoming/file.JPG b _ i r auser ftp 0 * c

结尾处的c表示转移已完成。

因此,如果我必须检查文件是否真的为每个传入文件完成,那么对于实际完成的文件来说,这意味着不必要的延迟。

似乎这不应该是一个不寻常的问题,但找不到任何关于它的东西。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不幸的是,对于这种用例,没有好的答案。问题是只有 FTP客户端知道何时完成将数据上传到服务器,并且 FTP客户端知道"文件&#34 ;已经完成了。该协议根据字节流进行操作。而且,正如您在APPE命令中注意到的那样,除了一次上传外,还可以在中进行上传。请注意,当FTP客户端使用REST命令后跟STOR时,可能会发生相同的行为。 (SFTP,为了进行比较,允许按块上传,它使用:OPENWRITEWRITE,{{ 1}},...,WRITE,更接近于用于编写文件的Unix系统调用。)

您甚至可能想要使用CLOSE命令作为触发器,以了解该客户端已完成将所有块上传到您的服务器。假设您的FTP客户端一次只打开一个FTP会话,这可能会有效。

根据您的具体用例/需求,可能会找出其他解决方案;如果您愿意,请随时给我发电子邮件。

希望这有帮助!

答案 1 :(得分:0)

还要处理检测JPG传输的结束并使用那些解决方案winch可以集成在脚本中:

Catching error: Corrupt JPEG data: premature end of data segment

  

检查JPEG数据是否完整的简单方法是分别检查FF D8和FF D9的前两个字节。这两个字节分别标识JPEG文件的开头和结尾。

或者使用ImageMagick http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=8483

希望这对D5有帮助;) 马修