0

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

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

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

有任何想法吗?

4

2 回答 2

0

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

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

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

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

希望这可能对 D5 有所帮助;) Mathieu

于 2016-01-16T01:09:09.537 回答
0

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

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

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

希望这可以帮助!

于 2016-01-09T19:41:38.447 回答