在没有回答我之前的问题时。
我正在使用多线程来通过控制套接字保持大型FTP传输。
不幸的是,这需要使用ftplib.ftp.transfercmd()(而不是FTP.retrbinary(),它不提供显式的套接字控制),它独占地返回数据套接字,并允许您无阻塞地发送'NOOP'命令。
这是一个问题,因为transfercmd(“RETR”...)默认为ASCII模式下的dwonloading,这会破坏我试图下载的视频文件。
我已经搜索了所有我可以找到明确的BINARY模式命令但无济于事。有什么想法吗?
继承人是我的下载代码
def downloadFile(filename, folder):
#login
ftp = FTP(myhost,myuser,passw)
ftp.set_debuglevel(2)
sock = ftp.transfercmd('RETR ' + filename)
def background():
f = open(folder + filename, 'wb')
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')
答案 0 :(得分:4)
由于retrbinary()
的{{3}}建议您必须使用TYPE I
命令告诉FTP服务器您想要二进制文件:
ftp.voidcmd('TYPE I')
# Do the transfer here
retrbinary
实际上为您进行了转移,但似乎没有更新连接以防止关闭。
你也不需要一个线程,只需在下载循环中放入ftp.voidcmd('NOOP'):
def downloadFile(filename, folder):
#login
ftp = FTP(myhost,myuser,passw)
ftp.set_debuglevel(2)
ftp.voidcmd('TYPE I')
sock = ftp.transfercmd('RETR ' + filename)
f = open(folder + filename, 'wb')
while True:
block = sock.recv(1024*1024)
if not block:
break
ftp.voidcmd('NOOP')
f.write(block)
sock.close()