首页 > 解决方案 > FTP:如何处理挂起和恢复下载?

问题描述

我每隔 6 小时左右定期通过 ftp 服务器下载一个 ~300 Mb 文件。大多数下载都很顺利,但有时进程挂起,我需要手动终止并重新启动。所以我想要一个更强大的下载系统,最好符合以下标准。

  1. 尽可能避免超时或挂起。如果它们发生,可以处理它们
  2. 如果下载被终止,请尝试恢复几次直到完成(如果在尝试的任何时间都不起作用,则发送错误消息)

对于(1),我在这个问题中读到,在所有块都被下载之前,最好将 python 线程与 keep_alive 调用一起使用。

def downloadFile(…):
    ftp = FTP(…)
    sock = ftp.transfercmd('RETR ' + filename)
    def background():
        f = open(…)
        while True:
            block = sock.recv(1024*1024)
            if not block:
                break
            f.write(block)
        sock.close()
    t = threading.Thread(target=background)
    t.start()
    while t.is_alive():
        t.join(60)
        ftp.voidcmd('NOOP')

对于 (2),可能有一个循环来检查文件是否已完全下载。如果没有,它可以从原来的位置重新启动。基于这个问题

for i in range(3):
    if "Check if file has been completely downloaded":
        if os.path.exists(filename):
            restarg = {'rest': str(os.path.getsize(filename))}
        else:
            restarg = {}
        ftp.transfercmd("RETR " + filename, **restarg)

但是如何结合(1)和(2)呢?您可以恢复线程下载吗?有许多我们甚至不知道下载顺序的块..

如果这两种方法不能结合起来,你还有什么别的想法吗?

另外,我不太确定如何判断 ftp 下载是否完成。我应该为此检查文件大小吗?文件大小可能会从一个下载更改为另一个。

标签: pythonftpkeep-alive

解决方案


推荐阅读