2017-06-08 49 views
0

查看所有可能的選項。 我正在使用boto3和python3.6將文件上傳到s3存儲桶,有趣的是,當json甚至.py文件被上傳時,它在上傳CSV時拋出錯誤500。在成功uplaod我返回一個JSON來檢查所有的值。使用boto3和python燒錄器將CSV文件上傳到S3存儲區時發生錯誤500

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

請幫忙!!

+0

s3日誌說什麼? – salient

+0

嘗試捕捉並顯示調用'put_object()'時引發的異常,或者在Flask應用程序中啓用調試(設置'app.debug = True')。 – mhawke

+0

@salient不知道該怎麼做..讓我谷歌.... –

回答

0

對於文件xyz.csv,您收到FileNotFoundError,因爲該文件不存在。

這可能是因爲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({...}) 

沒有必要將文件實際保存到文件系統;它可以直接使用upload_file對象的stream屬性被傳輸到您的S3存儲:

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) 

爲了使這個更通用的,你應該使用上傳文件的content_type屬性,如上圖所示。

+0

有了這個,我使用的流方法,因爲我不文件去服務器,而該解決的問題「文件未找到」我開始下面的消息 「botocore.exceptions.ClientError:發生錯誤(存取遭拒)當調用PutObject操作時:拒絕訪問「 即使當我爲IAM用戶設置以下存儲桶策略 s3:PutObject」,「s3:PutObjectAcl」 –

+0

它終於得到解決,我不得不在服務器上保存一個臨時副本把它上傳。使用 「file.save(文件名)」 的文件暫時保存使用前上傳 「s3.Bucket(os.environ.get( 'S3_BUCKET'))。upload_file(文件名,文件名)」 –

相關問題