2012-04-09 80 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