我有一个通过FTP处理传入文件的服务。
在安装了Proftpd的Debian服务器上,我使用一个iNotify事件来确定文件传输何时完成,并且我可以开始使用它。
一旦文件不再被写入,就会触发该事件。
直到我发现新的尼康D4相机和WT-5无线发射机使用APPE命令来发送文件之前,这是非常有效的。
据我所读,APPE命令似乎以数据块的形式发送文件,这些数据块在第一个块创建文件后附加到服务器上的现有文件中。
但是,这会导致几个iNotify事件被触发,因为文件是witten到几次,而不是一次,直到连接关闭。
由于文件是在文件完成之前处理的,因此一旦处理完,就会导致错误。一旦处理完文件我就会删除。
由于我的这项服务必须保持快速处理传入文件,我非常喜欢这个解决方案与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表示转让已经完成。
因此,如果我必须检查每个传入文件是否实际完成了该文件,这将意味着对于实际已完成的文件来说将出现不必要的延迟。
似乎这不是一个不寻常的问题,但却找不到任何关于它的东西。
有什么想法吗?
发布于 2016-01-09 19:41:38
不幸的是,这种用例没有很好的答案。问题是只有FTP客户端知道何时将数据上传到服务器,而FTP客户端知道何时完成“文件”。该协议以字节流的形式运行。而且,正如您已经注意到的,在APPE命令中,除了一次上传之外,上传还可以以块的形式进行。请注意,如果FTP客户端使用REST命令,然后是STOR,则可能会发生相同的行为。(比较而言,SFTP只允许按块上传,即它使用:OPEN、WRITE、WRITE、WRITE、.、CLOSE,更接近于用于编写文件的Unix系统调用。)
您甚至可能会尝试使用QUIT命令作为触发器,以了解该客户端已经完成了将其所有块上载到服务器。假设您的FTP客户端一次只打开一个FTP会话,这可能是可行的。
根据您的具体用例/需求,可能有可能找到其他解决方案;如果您愿意,可以随时给我发电子邮件。
希望这能有所帮助!
发布于 2016-01-16 01:09:09
Got还负责检测JPG传输的结束,并使用这些解决方案,绞车可以集成在脚本中:
Catching error: Corrupt JPEG data: premature end of data segment
一种检查数据是否完整的简单方法是分别检查FF D8和FF D9的前两个字节和最后两个字节。这两个字节分别标识JPEG文件的开始和结束。
或使用ImageMagick http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=8483
希望这能对D5有所帮助;)
https://stackoverflow.com/questions/10553304
复制相似问题