upload-to-s3 1.95 KB
#!/usr/bin/python

"""
Upload a file to S3
"""

from sys import argv, stdout
from time import time
from os.path import basename
from optparse import OptionParser

from boto.s3.key import Key
from boto.s3.connection import S3Connection


def uploadFile( bucket, filename, dest=None ):
    "Upload a file to a bucket"
    if not bucket:
        bucket = 'onos'
    if not dest: 
        key = basename( filename )
    else:
        key = dest + basename( filename ) #FIXME add the /
    print '* Uploading', filename, 'to bucket', bucket, 'as', key
    stdout.flush()
    start = time()
    def callback( transmitted, size ):
        "Progress callback for set_contents_from_filename"
        elapsed = time() - start
        percent = 100.0 * transmitted / size
        kbps = .001 * transmitted / elapsed
        print ( '\r%d bytes transmitted of %d (%.2f%%),'
                ' %.2f KB/sec ' %
                ( transmitted, size, percent, kbps ) ),
        stdout.flush()
    conn = S3Connection()
    bucket = conn.get_bucket( bucket )
    k = Key( bucket )
    k.key = key
    k.set_contents_from_filename( filename, cb=callback, num_cb=100 )
    print
    elapsed = time() - start
    print "* elapsed time: %.2f seconds" % elapsed

if __name__ == '__main__':
    usage = "Usage: %prog [options] <file to upload>"
    parser = OptionParser(usage=usage)
    parser.add_option("-b", "--bucket", dest="bucket",
                      help="Bucket on S3")
    parser.add_option("-d", "--dest", dest="dest",
                      help="Destination path in bucket")
    parser.add_option("-k", "--key", dest="awsKey",
                      help="Bucket on S3")
    parser.add_option("-s", "--secret", dest="awsSecret",
                      help="Bucket on S3")
    (options, args) = parser.parse_args()
    
    if len( args ) == 0:
        parser.error("missing filenames")
    for file in args:
        uploadFile( options.bucket, file, options.dest )

    #FIXME key and secret are unused