如何阻止ftp在python下载?
问题描述:
以下是我用来通过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()
答
错误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.
希望这能帮到你。 :)
答
这是一种使用看门狗定时器的方法。这涉及到创建一个单独的线程,这取决于您的应用程序的设计可能不可接受。
要杀死一个用户事件的下载,这是一个想法。如果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
调用不应传输有效载荷数据。
答
这是您的会话空闲时间过长。您可以在总统后将文件归档为实例化ftplib。除此以外。修改ftp软件配置。
例如,你可以使用vsftpd的,你可以添加以下配置的vsftpd.conf:
idle_session_timeout=60000 # The default is 600 seconds
我试过你的代码,它挂起:) – unice 2012-04-09 13:45:19
“FTP.abort() - >中止正在进行的文件传输,使用它并不总是有效,但值得一试。“这是我们可以在文档中找到的...如果超时错误消失,你能让我知道吗 – blackwind 2012-04-09 13:57:32
它仍然会引发超时错误。我已阅读有关ftp.abort(),这就是为什么我想知道是否有其他方式停止下载没有超时错误。 – unice 2012-04-09 14:04:01