2012-04-09 109 views
0

以下是我用来通过ftp下载的一些代码。我试图停止下载,然后继续或重新下载。我试过ftp.abort(),但它只是挂起并返回超时。如何阻止ftp在python下载?

ftplib.error_proto: 421 Data timeout. Reconnect. Sorry. 

场景: 的方案是,用户会选择要下载的文件,同时下载,用户可以停止当前的下载和下载新的文件。如果用户停止下载,代码'if os.path.getsize(self.file_path)> 117625:'就是我的例子。它不是文件的完整大小。

谢谢。

from ftplib import FTP 

class ftpness: 

    def __init__(self): 
      self.connect(myhost, myusername, mypassword) 

    def handleDownload(self,block): 
     self.f.write(block) 
     if os.path.getsize(self.file_path) >117625: 
       self.ftp.abort() 

    def connect(self,host, username, password): 
     self.ftp = FTP(host) 
     self.ftp.login(username, password) 
     self.get(self.file_path) 

    def get(self,filename): 
     self.f = open(filename, 'wb') 
     self.ftp.retrbinary('RETR ' + filename, self.handleDownload) 
     self.f.close() 
     self.ftp.close 

a = ftpness() 

回答

0

错误421是std超时错误。所以需要有连接,直到文件被下载。

def handleDownload(self,block): 
     self.f.write(block) 
     if os.path.getsize(self.file_path) >117625: 
       self.ftp.abort() 
     else: 
       self.ftp.sendcmd('NOOP') 
#try to add this line just to keep the connection alive. 

希望这能帮到你。 :)

+0

我试过你的代码,它挂起:) – unice 2012-04-09 13:45:19

+0

“FTP.abort() - >中止正在进行的文件传输,使用它并不总是有效,但值得一试。“这是我们可以在文档中找到的...如果超时错误消失,你能让我知道吗 – blackwind 2012-04-09 13:57:32

+0

它仍然会引发超时错误。我已阅读有关ftp.abort(),这就是为什么我想知道是否有其他方式停止下载没有超时错误。 – unice 2012-04-09 14:04:01

0

这是一种使用看门狗定时器的方法。这涉及到创建一个单独的线程,这取决于您的应用程序的设计可能不可接受。

要杀死一个用户事件的下载,这是一个想法。如果GUI在单独的线程中工作,那么该线程可以直接到达FTP实例内部并直接关闭其套接字。

from threading import Timer 

class ftpness: 
    ... 

    def connect(self,host, username, password): 
     self.ftp = FTP(host) 
     self.ftp.login(username, password) 
     watchdog = Timer(self.timeout, self.ftp.sock.close) 
     watchdog.start() 
     self.get(self.file_path) 
     watchdog.cancel() # if file transfer succeeds cancel timer 

这样,如果文件传输的运行速度比你预设的超时时间,计时器线程关闭套接字转移下,迫使get调用引发异常。只有传输成功时,看门狗定时器才会被取消。

虽然这与您的问题无关,但通常connect调用不应传输有效载荷数据。

0

这是您的会话空闲时间过长。您可以在总统后将文件归档为实例化ftplib。除此以外。修改ftp软件配置。

例如,你可以使用vsftpd的,你可以添加以下配置的vsftpd.conf:

idle_session_timeout=60000 # The default is 600 seconds