【问题标题】:python ftplib transfercmd() BINARY Modepython ftplib transfercmd() 二进制模式
【发布时间】: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() 实际上是如何打开套接字并扩展类以覆盖该方法的。 src ntrasfercmd() 就在上面,所以向上滚动一点。
  • 谢谢。实际上,我刚刚明确发送了一个 voidcmd("TYPE I") 来强制执行二进制文件,这基本上是我在扩展 ftp lib 时所做的。所以你是正确的!如果您回答问题,我将投票并接受

标签: python multithreading sockets ftp


【解决方案1】:

正如retrbinary()source 所建议的,您必须使用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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多