It seems to me that in the example code that stores the uploaded file to a temporary file, you would just replace file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
with code that uploads the file to S3 instead.
For example, from the linked page:
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
s3 = boto.connect_s3()
bucket = s3.create_bucket('my_bucket')
key = bucket.new_key(filename)
key.set_contents_from_file(file, headers=None, replace=True, cb=None, num_cb=10, policy=None, md5=None)
return 'successful upload'
return ..
Or if you want to upload to S3 asynchrnously, you could use whatever queuing mechanism is provided by Heroku.