使用烧瓶上传文件到亚马逊s3

时间:2014-01-19 23:31:51

标签: python file-upload amazon-s3 flask

这是处理上传请求的代码:

@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)

我尝试了3个选项:

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

那么将文件上传到亚马逊s3的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

以下是使用HTML文件输入标记Python,Flask和Boto将多个文件上传到Amazon S3的fully-functioning example

使这项工作的主要关键是Flask的request.files.getlist和Boto的set_contents_from_string

一些提示:

  • 请务必设置S3存储桶权限和IAM用户权限,否则上传将失败。详情请参阅自述文件。
  • 不要忘记在HTML表单标记中包含 enctype =“multipart / form-data”
  • 不要忘记在HTML输入标记中包含 multiple 属性。
  • 不要忘记将AWS用户的凭据存储在环境变量中,如自述文件中所示。确保在运行Python的会话中可以使用这些环境变量。

答案 1 :(得分:4)

在以下代码中的代码中:

k.set_contents_from_string(data_file.readlines())

您正在向Amazon发送list个字符串(以换行符终止!)而不是文件内容。

您需要传递一个包含文件内容的str对象:

set_contents_from_string(data_file.read())