我正在编写一个自定义的ftp客户端,充当从我们的合作伙伴之一雇用的分包商传入的多媒体内容的看门人.我选择了twisted,因为它允许我在将文件本地写入磁盘之前先解析文件内容,而且我一直在寻找机会以任何方式探索twisted.我正在使用“ twisted.protocols.ftp.FTPClient.retrieveFile”来获取文件,将转义的路径传递给文件,并将协议传递给“ retrieveFile”方法.我要绝对确定已检索到整个文件,因为回叫中的事件处理程序将把文件写到本地磁盘上,然后从ftp服务器中删除远程文件,在lftp中执行all -E切换行为客户.我的问题是,我真的需要为此担心吗,还是可以假设如果未完全检索文件,则会发生错误回复?
解决方法:
对于此区域的行为,有几个单元测试.
twisted.test.test_ftp.FTPClientTestCase.test_failedRETR是最直接相关的.它涵盖了在文件传输过程中失去控制和数据连接的情况.
在我看来,该领域的测试覆盖率可能会大大提高.例如,没有测试涉及仅在进行传输时丢失数据连接的情况.但是,使这一问题变得棘手的一件事是FTP并不是一种非常可靠的协议.数据连接关闭表示文件传输已结束.为了安全起见,您必须检查是否收到了与预期接收的一样多的字节.执行此检查的唯一方法是事先知道文件大小,或使用LIST(FTPClient.list)向服务器询问文件大小.
考虑到所有这些,我建议在文件传输完成后,始终询问服务器应该获得多少字节,并确保它与传递给协议的字节数一致.有时您可能会对从retrieveFile返回的Deferred产生错误提示,但这即使在您没有的情况下也可以确保您的安全.
标签:ftp,client,twisted,python
来源: https://codeday.me/bug/20191107/2002330.html