2016-06-18 9 views
5

Ich habe meinen React-Client eine Datei mit der Fetch-API an den Endpunkt '/ Dataset' senden lassen.Flask-Server kann keine Datei lesen, die durch POST-Anforderung hochgeladen wurde

import 'whatwg-fetch'; 

uploadData(csv) { 
    this.dataset = csv; 

    fetch('/dataset', { 
     method: 'POST', 
     body: this._fileToFormData(csv) 
    }).then(
     (response) => { 
      console.log(response); 
     } 
    ).catch(() => {}); 
}; 

_fileToFormData(file) { 
     var formData = new FormData(); 
     formData.append('file', file); 
     return formData 
    }; 

Mein Flask-Server soll es abholen.

@app.route('/dataset', methods=['POST']) 
def dataset(): 
    print request.get_data() 
    csv_data = request.form['file'] 
    print csv_data 
    return '{ "fake_json":100}', 200 

jedoch das csv_data Objekt ist einfach eine Unicode-String, '[object File]'

Der Code

print "form:", request.form 
print "files:", request.files 

kehrt

ImmutableMultiDict([('file', u'[object File]')]) 
ImmutableMultiDict([]) 

Wie kann ich den eigentlichen Inhalt der CSV erhalten Datei?

=== EDIT: Gelöst ===

die Variable CSV war tatsächlich ein einzelner Datei-Array, so dass ich erforderlich, um die Datei aus zu extrahieren.

+0

Haben Sie file.read() ausprobiert, anstatt das Dateiobjekt aus dem Formular zurückzugeben? Ich denke, es würde aussehen, csv_data.read()? – glls

+0

Ja, ich bekomme eine Fehlermeldung, dass das Unicode-Objekt nicht über die Methode .read verfügt:/ – jldork

+0

Was ist 'csv', wenn Sie das' uploadDoc' aufrufen? Sind Sie sicher, dass 'FormData' etwas als Dateieingabe versteht? – davidism

Antwort

1

Hochgeladene Dateien sind in request.files, nicht request.form verfügbar. Die Werte sind dateiähnliche Objekte. Um die Daten zu erhalten, müssen Sie die Datei lesen.

data = request.files['file'].read() 

Siehe Flask docs für einige Beispiele für mit Uploads arbeiten.


Sie müssen auch die Datei korrekt hochladen. GitHubs fetch polyfill hat ein Beispiel mit FormData, um den Körper richtig zu formatieren. Sie müssen eine einzelne Datei oder Eingabe an jeden Anruf an append übergeben.

var input = document.querySelector('input[type="file"]') 
var data = new FormData() 
data.append('file', input.files[0]) 

fetch('/dataset', { 
    method: 'POST', 
    body: data 
}) 
+0

request.files ist für mich leer? – jldork

+0

Ich sehe, es ist aus der Bibliothek https://github.com/github/fetch Quick q: so normalerweise, wenn Sie ein Dateiobjekt an FormData() anhängen und es POST, Sie würden es in request.files sehen? – jldork

+0

Eigentlich war das das Beispiel, dem ich folgte! Ich habe die FormData-Erstellung nur in meiner Funktion _fileToFormData() eingeschlossen – jldork