【发布时间】:2013-11-11 09:29:02
【问题描述】:
在没有回答我之前的问题的情况下。
我正在使用多线程来通过控制套接字保持大型 FTP 传输。
不幸的是,这需要使用 ftplib.ftp.transfercmd()(而不是不提供显式套接字控制的 FTP.retrbinary()),它专门返回数据套接字并允许您发送“NOOP”命令而不会阻塞。
这是一个问题,因为 transfercmd("RETR" ...) 默认以 ASCII 模式进行 dwonloading,这会损坏我尝试下载的视频文件。
我已经搜索了所有 Ican 以找到明确的 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')
【问题讨论】:
-
您很可能没有在您的其他帖子中看到我的second comment。
-
嗨@plg。我看到了你的第二条评论,但不幸的是你没有正确阅读任何一篇文章。我无法使用 RETRBINARY,因为我需要明确访问数据套接字,只有 transfercmd 才能为您提供
-
哦,抱歉,我没有查看 ftplib 的源代码,并假设它也返回了一个套接字。我建议你看看
FTP.transfercmd()实际上是如何打开套接字并扩展类以覆盖该方法的。 srcntrasfercmd()就在上面,所以向上滚动一点。 -
谢谢。实际上,我刚刚明确发送了一个 voidcmd("TYPE I") 来强制执行二进制文件,这基本上是我在扩展 ftp lib 时所做的。所以你是正确的!如果您回答问题,我将投票并接受
标签: python multithreading sockets ftp