File: ftp-put.py (original) (raw)

#!/usr/bin/python ###!/usr/local/bin/python3 """

Put (upload) one file by FTP in binary mode.

(Caveat: this script may not be very useful today, because most ISPs no longer support its basic FTP. To upload to websites, you will likely need to use a secure SSL-based interface like SFTP or scp instead. See the web for related Python tools.)

Usage: on Unix make executable with "chmod +x ftp-put.py", store your FTP site+rdir+user+pswd in "ftp-config.txt" (one per line) in this script file's own folder, and run with a file to upload:

ftp-put.py filename

For example, as part of a general site build/update process: cd /MY-STUFF/Websites py3 _PUBLISH.PY # generate/collect site files cd UNION ../ftp-put.py index.html # to upload changed files only ../ftp-put.py photo.png

The "ftp-config.txt" file (but omit indents and "#..."): ftp-server-domain-name # e.g., learning-python.com ftp-remote-directory # e.g., html or . (. = no cd) ftp-user-name # your account name ftp-user-password # your account password

You can also run this from any IDE that supports command-line arguments (see PyEdit: learning-python.com/pyedit.html). On Windows, usage is the same but with "" and without "chmod."

This is a variation of the first FTP upload example in the book PP4E; works on Python 3.X and 2.X (pick a #! above as desired); and uses your platform's default Unicode encoding for configs.

"""

from future import print_function # 2.X: standard on Mac OS import ftplib # socket-based FTP tools

def putfile(file, site, rdir='.', login=(), verbose=True): """ -------------------------------------------------- Upload a file by ftp to a remote site + directory. Uses binary transfer, and anonymous or real login. login: ()=anonymous, (user, pswd)=a real account. rdir: "." default means no remote cwd is required. -------------------------------------------------- """ if verbose: print('Uploading', file) local = open(file, 'rb') # local file of same name remote = ftplib.FTP(site) # connect to FTP site remote.login(*login) # anonymous or (user, pswd) remote.cwd(rdir) # goto remote dir (or '.') remote.storbinary('STOR ' + file, local) # xfer with default blocksize remote.quit() local.close() if verbose: print('Upload done.')

if name == 'main': """ -------------------------------------------------- Script (command-line) use. Pass one arg = filename. All four FTP parameters are lines in file ftp-configs.txt in script's dir. -------------------------------------------------- """ import sys, os print('Python', sys.version.split()[0])

# file to transfer in command-line arg (one per run: keep it simple)
file = sys.argv[1]

# ftp parameters from file, one per line (or getpass.getpass(prompt))
scriptdir = os.path.dirname(__file__)
configs = os.path.join(scriptdir, 'ftp-config.txt')
site, rdir, user, pswd = [line.rstrip() for line in open(configs)][:4]

# upload the target file
putfile(file, site, rdir, login=(user, pswd), verbose=True)   # nonanonymous login