Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

upload file using flask to amazon s3

This is the code that handles the uploading request:

@app.route('/upload', methods=['POST'])
def upload():
    if request.method == 'POST':
        test = request
        data_file = request.files.get('file')
        file_name = data_file.filename
        conn = S3Connection(settings.ACCESS_KEY, settings.SECRET_KEY)
        bucket = conn.get_bucket(settings.BUCKET_NAME)
        k = Key(bucket)
        k.key = 'file_test.jpg'
        # k.set_contents_from_file(data_file)
        k.set_contents_from_string(data_file.readlines())

        # return jsonify(name=file_name)
        return jsonify(name=file_name)

I've tried 3 options:

k.set_contents_from_string(data_file.readlines())
k.set_contents_from_file(data_file)
k.set_contents_from_stream(data_file.readlines())

So what is the right way to upload files to amazon s3?

like image 686
nam Avatar asked Jan 19 '14 23:01

nam


1 Answers

Here is a fully-functioning example of how to upload multiple files to Amazon S3 using an HTML file input tag, Python, Flask and Boto.'

The main keys to making this work are Flask's request.files.getlist and Boto's set_contents_from_string.

Some tips:

  • Be sure to set S3 bucket permissions and IAM user permissions, or the upload will fail. The details are in the readme.
  • Don't forget to include enctype="multipart/form-data" in your HTML form tag.
  • Don't forget to include the attribute multiple in your HTML input tag.
  • Don't forget to store the AWS user's credentials in environment variables as shown in the readme. Make sure these environment variables are available in the session where Python is running.
like image 181
Steve Saporta Avatar answered Oct 03 '22 14:10

Steve Saporta