python ftplib transfercmd()BINARY模式

时间:2013-10-31 11:35:06

标签: python multithreading sockets ftp

在没有回答我之前的问题时。

我正在使用多线程来通过控制套接字保持大型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')

1 个答案:

答案 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()