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

Posted

技术标签:

【中文标题】APPE FTP命令传输完成检测服务器端【英文标题】:APPE FTP command transfer completion detection serverside 【发布时间】:2012-05-11 14:27:06 【问题描述】:

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

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

看起来这应该不是一个不寻常的问题,但找不到任何相关信息。

有什么想法吗?

【问题讨论】:

你在 inotify 中监听哪个事件? 我正在收听 IN_CLOSE_WRITE。 【参考方案1】:

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

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

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

希望这会有所帮助!

【讨论】:

【参考方案2】:

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

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 有所帮助;) 马修

【讨论】:

以上是关于APPE FTP命令传输完成检测服务器端的主要内容,如果未能解决你的问题,请参考以下文章

文件传输协议

CentOS 下vsftp 安装--虚拟用户

什么是FTP?FTP端口号是多少?FTP的端口号能改吗

FTP(主动与被动)

Linux里面FTP主被动模式区别是啥?

FTP文件传输服务