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



我有一个通过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 表示传输已完成。

因此,如果我必须检查每个传入文件的文件是否实际完成,这将意味着实际完成的文件会出现不必要的延迟。

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

有什么想法吗?

不幸的是,

对于这种用例没有好的答案。 问题是只有FTP客户端知道何时完成将数据上传到服务器,而FTP客户端知道何时完成"文件"。 该协议以字节流的形式运行。 而且,正如您在 APPE 命令中注意到的那样,除了一次上传之外,上传还可以分进行。 请注意,当 FTP 客户端使用 REST 命令后跟 STOR 时,也会发生相同的行为。 (相比之下,SFTP允许按块上传,它使用:OPENWRITEWRITEWRITE,...,CLOSE,更接近于用于写入文件的Unix系统调用。

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

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

希望这有帮助!

还必须处理 JPG 传输的结束并使用这些解决方案,绞盘可以集成到脚本中:

捕获错误:JPEG 数据损坏:数据段过早结束

检查

JPEG数据是否完整的简单方法是分别检查FF D8和FF D9的第一个和最后两个字节。这两个字节分别标识 JPEG 文件的开始和结束。

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

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

最新更新