Is it possible to upload an object into memory on FTP using Python?

Here's what I'm doing now:

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')

      

Writing files to disk and then deleting them seems to be an additional work on the system that should be avoided. Is it possible to upload an object into memory on FTP using Python?

+3


a source to share


3 answers


Because of duck-typing, the file object ( f

in your code) only needs to support a call .read(blocksize)

to work with storbinary

. When you come across questions like this, I go to the source, in this case 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()

      



As commented it only wants a file-like object , indeed it doesn't even look particularly like a file, it just needs read(n)

, StringIO provides such "memory files".

+6


a source


import urllib
import ftplib

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

      



+1


a source


You can use any file-like object in memory , for example BytesIO

:

from io import BytesIO

      

It works in binary with FTP.storbinary

:

f = BytesIO(b"the contents")
ftp.storbinary("STOR /path/file.txt", f)

      

and also in ascii / text mode with FTP.storlines

:

f = BytesIO(b"the contents")
ftp.storlines("STOR /path/file.txt", f)

      


For more detailed examples see:

0


a source







All Articles