2010-04-19 48 views
2

這裏是我現在在做什麼:我可以使用Python將內存中的對象上傳到FTP嗎?

mysock = urllib.urlopen('http://localhost/image.jpg') 
fileToSave = mysock.read() 
oFile = open(r"C:\image.jpg",'wb') 
oFile.write(fileToSave) 
oFile.close 
f=file('image.jpg','rb') 
ftp.storbinary('STOR '+os.path.basename('image.jpg'),f) 
os.remove('image.jpg') 

文件寫入磁盤,然後imediately刪除它們似乎應避免在系統上額外的工作。我可以使用Python將內存中的對象上傳到FTP嗎?

+0

你可以使用類似文件的對象嗎? – 2010-04-19 21:48:20

回答

6

因爲duck-typing的文件對象(f在你的代碼)只需要支持.read(blocksize)調用與storbinary工作。當面對這樣的問題,我去源,在這種情況下的lib/python2.6的/ ftplib.py:

def storbinary(self, cmd, fp, blocksize=8192, callback=None): 
    """Store a file in binary mode. A new port is created for you. 

    Args: 
     cmd: A STOR command. 
     fp: A file-like object with a read(num_bytes) method. 
     blocksize: The maximum data size to read from fp and send over 
       the connection at once. [default: 8192] 
     callback: An optional single parameter callable that is called on 
       on each block of data after it is sent. [default: None] 

    Returns: 
     The response code. 
    """ 
    self.voidcmd('TYPE I') 
    conn = self.transfercmd(cmd) 
    while 1: 
     buf = fp.read(blocksize) 
     if not buf: break 
     conn.sendall(buf) 
     if callback: callback(buf) 
    conn.close() 
    return self.voidresp() 

至於評論,只想要一個file-like object,實際上它甚至不是特別文件 - 像,它只需要read(n)StringIO提供這樣的「存儲器文件」服務。

+1

很棒的回答。我認爲這應該可以工作,但是無法將它包裹起來。 – fsckin 2010-04-19 22:04:12

1
import urllib 
import ftplib 

ftp = ftplib.FTP(...) 
f = urllib.urlopen('http://localhost/image.jpg') 
ftp.storbinary('STOR image.jpg', f) 
相關問題