2013-10-31 102 views
2

在沒有我的上一個問題的答案。python ftplib transfercmd()BINARY模式

我正在使用multihtreading通過控制套接字保持大型FTP傳輸活着。

不幸的是,這需要使用ftplib.ftp.transfercmd()(而不是FTP.retrbinary(),它沒有給出明確的套接字控制),它專門返回數據套接字並允許您發送'NOOP'命令而不會阻塞。

這是一個問題,因爲transfercmd(「RETR」...)默認爲在ASCII模式下下載,這會破壞我嘗試下載的視頻文件。

我已經搜遍了一切可以找到明確的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

你很可能沒有看到我的[第二個評論](HTTP:/ /stackoverflow.com/questions/19703379/python-ftplib-handbrake-unrecognized-file-type?noredirect=1#comment29268611_19703379)。 – ThinkChaos

+0

hi @plg。我看到了您的第二條評論,但不幸的是您沒有正確閱讀任何帖子。我被阻止使用RETRBINARY,因爲我需要明確地訪問數據套接字,並且只有transfercmd爲您提供那個 – hammus

+1

哦,對不起,我沒有看過ftplib的源代碼,並假定它也返回一個套接字。我建議你看看'FTP.transfercmd()'實際上是如何打開套接字並擴展類以覆蓋該方法的。 [src](http://hg.python.org/cpython/file/2.7/Lib/ftplib.py#l374)'ntrasfercmd()'就在上面,所以只需向上滾動一下。 – ThinkChaos

回答

3

由於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()