使用boto3和python flask将CSV文件上载到S3存储桶时出错500

时间:2017-06-08 11:18:06

标签: python csv amazon-web-services heroku amazon-s3

看了所有可能的选择。 我正在使用boto3和python3.6将文件上传到s3存储桶,有趣的是当json甚至.py文件上传时,它在上传CSV时抛出错误500。在成功上传后,我将返回一个json来检查所有值。

    import boto3
    from botocore.client import Config

    @app.route("/upload",methods = ['POST','GET'])
    def upload(): 
    if request.method == 'POST':
        file = request.files['file']
        filename = secure_filename(file.filename)
        s3 = boto3.resource('s3', aws_access_key_id= os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'),config=Config(signature_version='s3v4'))
        s3.Bucket(os.environ.get('S3_BUCKET')).put_object(Key=filename, Body=open(filename, 'rb'), ContentEncoding='text/csv')
        return jsonify({'successful upload':filename, 'S3_BUCKET':os.environ.get('S3_BUCKET'), 'ke':os.environ.get('AWS_ACCESS_KEY_ID'), 'sec':os.environ.get('AWS_SECRET_ACCESS_KEY'),'filepath': "https://s3.us-east-2.amazonaws.com/"+os.environ.get('S3_BUCKET')+"/" +filename})

请帮助!!

1 个答案:

答案 0 :(得分:0)

您收到文件FileNotFoundError的{​​{1}},因为该文件不存在。

这可能是因为xyz.csv中的代码实际上并没有保存上传的文件,它只是为它获取一个安全的名称并立即尝试打开它 - 它失败了。

它适用于其他文件可能是因为这些文件已经存在,可能是测试遗留的,所以没有问题。

尝试获取安全文件名后,使用upload()将文件保存到文件系统:

save()

然后上传(假设您已配置upload_file = request.files['file'] filename = secure_filename(upload_file.filename) upload_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) ):

UPLOAD_FOLDER

无需将文件实际保存到文件系统中;它可以使用with open(os.path.join(app.config['UPLOAD_FOLDER'], filename), 'rb') as f: s3.Bucket(os.environ.get('S3_BUCKET')).put_object(Key=filename, Body=f, ContentEncoding='text/csv') return jsonify({...}) 对象的stream属性直接流式传输到S3存储桶:

upload_file

为了使这更通用,您应该使用上传文件的upload_file = request.files['file'] filename = secure_filename(upload_file.filename) s3 = boto3.resource('s3', aws_access_key_id='key', aws_secret_access_key='secret') s3.Bucket('bucket').put_object(Key=filename, Body=upload_file.stream, ContentType=upload_file.content_type) 属性,如上所示。