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?
a source to share
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".
a source to share
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:
a source to share