2017-06-08 5 views
0

Art von alle möglichen Optionen. Ich benutze Boto3 und Python3.6, um die Datei in S3 Eimer, Lustige Sache ist, während JSON und sogar .py-Datei wird hochgeladen, es wirft Error 500 beim Hochladen von CSV. Bei erfolgreichem Uplaod gebe ich einen JSON zurück, um alle Werte zu überprüfen.Fehler 500 beim Hochladen von CSV-Datei in S3-Bucket mit Boto3 und Python Kolben

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

Bitte helfen Sie !!

+0

Was sagen die s3 Logs? – salient

+0

Versuchen Sie, die beim Aufruf von 'put_object()' erzeugte Ausnahme abzufangen und anzuzeigen, oder aktivieren Sie das Debugging in Ihrer Flask-App (legen Sie 'app.debug = True' fest). – mhawke

+0

@salient nicht sicher, wie das zu tun .. lass mich das googeln .... –

Antwort

0

Sie erhalten eine FileNotFoundError für Datei xyz.csv, weil die Datei nicht existiert.

Dies könnte daran liegen, dass der Code in upload() die hochgeladene Datei nicht wirklich speichert, sondern lediglich einen sicheren Namen dafür erhält und sofort versucht, sie zu öffnen - was fehlschlägt.

Dass es für andere Dateien funktioniert, liegt wahrscheinlich an der Tatsache, dass diese Dateien bereits existieren, vielleicht vom Testen übrig geblieben sind, also gibt es kein Problem.

Versuchen Sie die Datei in dem Dateisystem Speicher mit save() nach den sicheren Dateinamen zu erhalten:

upload_file = request.files['file'] 
filename = secure_filename(upload_file.filename) 
upload_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 

und dann das Hochladen (unter der Annahme, dass Sie ein UPLOAD_FOLDER konfiguriert haben):

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({...}) 

Es ist nicht notwendig, die Datei tatsächlich im Dateisystem zu speichern. direkt auf Ihren S3 Eimer mit dem stream Attribute des upload_file Objekts übertragen werden kann:

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) 

Um dies zu allgemeineren sollten Sie das content_type Attribut der hochgeladenen Datei verwenden, wie oben gezeigt.

+0

mit diesem ich die Stream-Methode verwendet, wie ich Datei nicht auf den Server gehen, während dies das Problem für "Datei nicht gefunden" gelöst Ich begann unter Nachricht "botocore.exceptions.ClientError: ein Fehler aufgetreten (AccessDenied) Beim Aufruf der PutObject-Operation: Zugriff verweigert " , auch wenn ich die folgende Bucket-Richtlinie für den IAM-Benutzer gesetzt habe s3: PutObject", "s3: PutObjectAcl" –

+0

Es wurde schließlich gelöst, ich musste eine temporäre Kopie auf dem Server speichern um es hochgeladen zu bekommen verwendet "file.save (Dateiname)", um die Datei temporär vor dem Hochladen mit "S3.Bucket (os.environ.get ('S3_BUCKET')) zu speichern. upload_file (Dateiname, Dateiname)" –

Verwandte Themen