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

nam*_*nam 5 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)
Run Code Online (Sandbox Code Playgroud)

我尝试了3种选择:

k.set_contents_from_string(data_file.readlines())
k.set_contents_from_file(data_file)
k.set_contents_from_stream(data_file.readlines())
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*rta 5

这是一个功能齐全的示例,说明如何使用HTML文件输入标签Python,Flask和Boto将多个文件上传到Amazon S3.

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

一些技巧:

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


Pao*_*llo 4

在您的代码中的以下行中:

k.set_contents_from_string(data_file.readlines())
Run Code Online (Sandbox Code Playgroud)

您正在向亚马逊发送一系列list字符串(以换行符结尾!),而不是按原样发送文件内容。

您需要传递str带有文件内容的单个对象:

set_contents_from_string(data_file.read())
Run Code Online (Sandbox Code Playgroud)