2016-06-18 39 views
5

Ho il mio client React che invia un file con l'API di recupero all'endpoint '/ dataset'.Il server Flask non può leggere il file caricato dalla richiesta POST

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

Il mio assistente Flask si suppone per raccoglierlo.

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

Tuttavia, l'oggetto csv_data è semplicemente una stringa unicode, '[object File]'

Il codice

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

rendimenti

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

Come faccio ad avere il contenuto effettivo del CSV file?

=== EDIT: Risolto ===

CSV variabile era in realtà un singolo array di file, quindi ho bisogno di estrarre il file fuori.

+0

hai provato file.read() anziché restituire l'oggetto file dal modulo? penso che sembrerebbe, csv_data.read()? – glls

+0

Sì, viene visualizzato un errore che dice che l'oggetto Unicode non ha il metodo. Read:/ – jldork

+0

Che cos'è 'csv' quando chiami quel' uploadDoc'? Sei sicuro che sia qualcosa che 'FormData' capisce di essere un input di file? – davidism

risposta

1

I file caricati sono disponibili in request.files, non request.form. I valori sono oggetti simili a file, quindi per ottenere i dati necessari per leggere il file.

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

Vedi l'Flask docs per alcuni esempi su come lavorare con i caricamenti.


Inoltre, è necessario caricare il file correttamente. GitHub's fetch polyfill ha un esempio utilizzando FormData per formattare correttamente il corpo. È necessario passare un singolo file o immettere ogni chiamata a append.

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 è vuoto per me? – jldork

+0

Vedo, viene dalla libreria https://github.com/github/fetch Rapido q: in genere, quando si aggiunge un oggetto file a FormData() e lo si POST, lo si vedrà in request.files? – jldork

+0

In realtà quello era l'esempio che stavo seguendo! Ho solo avvolto la creazione di FormData nella mia funzione _fileToFormData() – jldork