File data can also be uploaded through FTP. As with downloading, there are two basic functions for
uploading: storbinary()
and storlines()
. Both take a command to run, and a file-like object to
transmit. The storbinary()
function will call the read()
method repeatedly on that object until its
content is exhausted, while storlines()
, by contrast, calls the readline()
method.
Unlike the corresponding download functions, these methods do not require you to provide a
callable function of your own. (But you could, of course, pass a file-like object of your own crafting
whose read()
or readline()
method computes the outgoing data as the transmission proceeds.
binaryul.py
shows how to upload a file in binary mode.
from ftplib import FTP
import sys, getpass, os.path
if len(sys.argv) != 5:
print "usage: %s <host> <username> <localfile> <remotedir>" % (
sys.argv[0])
exit(2)
host, username, localfile, remotedir = sys.argv[1:]
password = getpass.getpass(
"Enter password for %s on %s: " % (username, host))
f = FTP(host)
f.login(username, password)
f.cwd(remotedir)
fd = open(localfile, 'rb')
f.storbinary('STOR %s' % os.path.basename(localfile), fd)
fd.close()
f.quit()
This program looks quite similar to our earlier efforts. Since most anonymous FTP sites do not permit file uploading, you will have to find a server somewhere to test it against; I simply installed the old, venerable ftpd on my laptop for a few minutes and ran the test like this:
root@erlerobot:~/Python_files# python binaryul.py localhost brandon test.txt /tmp
You can modify this program to upload a file in ASCII mode by simply changing storbinary()
to
storlines()
.