2015-11-15 18 views
10

Ho letto diverse domande correlate qui su SO ma non sono riuscito a trovare una soluzione funzionante.python-richieste post con nomi di file unicode

Ho un server Fiasca con questo codice semplificato:

app = Flask(__name__) 
api = Api(app) 


class SendMailAPI(Resource): 
    def post(self): 
     print request.files 
     return Response(status=200) 

api.add_resource(SendMailAPI, '/') 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', debug=True) 

Poi nel client:

# coding:utf-8 

import requests 

eng_file_name = 'a.txt' 
heb_file_name = u'א.txt' 

requests.post('http://localhost:5000/', files={'file0': open(eng_file_name, 'rb')}) 
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name, 'rb')}) 

Quando si invia la prima richiesta con il nome del file non UTF-8 Il server riceve la richiesta con il file e stampa ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)]), ma quando si invia il file con il nome file utf-8 il server non sembra ricevere il file mentre stampa ImmutableMultiDict([]).

sto usando richieste 2.3.0 ma il problema non si risolve con l'ultima versione, come pure (2.8.1), versione Flask è 0.10.1 e la versione Flask-RESTful è 0.3.4.

Ho fatto un po 'di scavo nel codice requests e la richiesta sembra essere inviata ok (cioè con il file), e ho stampato la richiesta appena prima di essere inviata e vedere il nome del file è stato effettivamente codificato in RFC2231:

--6ea257530b254861b71626f10a801726 
Content-Disposition: form-data; name="file0"; filename*=utf-8''%D7%90.txt 

in sintesi le cose, non sono del tutto sicuro se il problema si trova all'interno requests che non allegare correttamente il file per la richiesta o se Flask sta avendo problemi con la raccolta di file con i nomi di file che sono codificato secondo RFC2231.

UPDATE: sono imbattuto in questo problema in requests GitHub: https://github.com/kennethreitz/requests/issues/2505

+0

Poiché la richiesta è corretta, questo deve essere il server. La domanda sembra un'attività di debug run-of-the-mill per me. Aggiungi qualche punto di interruzione/debug di stampa qua e là per definire con precisione la specifica riga di codice che sbaglia. –

+0

quindi richieste codifica i nomi dei file in un modo che la beuta non supporta? – mehdy

risposta

1

ho risolvere questo problema con la lettura manualmente il file con read() e poi inviare il suo contenuto:

requests.post(upload_url, files={ 
    'file': ("photo.jpg", open(path_with_unicode_filename, 'rb').read()) 
}) 
2

Penso che forse ci sia confusione qui su codifica qui -

eng_file_name = 'a.txt' # ASCII encoded, by default in Python 2 
heb_file_name = u'א.txt' # NOT UTF-8 Encoded - just a unicode object 

Per inviare il secondo al server ciò che si vuole fare è questo:

requests.post('http://localhost:5000/', files={'file0': open(heb_file_name.encode('utf-8'), 'rb')}) 

Sono un po 'sorpreso che non genera un errore sul client cerca di aprire il file anche se - si vede niente sul client che indica un errore?

MODIFICA: Un modo semplice per confermare o negare la mia idea è ovviamente di stampare i contenuti dall'interno del client per garantire che venga letto correttamente.