2015-11-15 5 views
10

Ich habe einige verwandte Fragen hier auf SO gelesen, aber nicht geschafft, eine funktionierende Lösung zu finden.python-Anfragen Post mit Unicode-Dateinamen

Ich habe einen Kolben Server mit diesem vereinfachten Code:

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) 

dann in dem 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')}) 

Wenn die erste Anforderung mit dem nicht-UTF-8-Dateinamen sendet der Server die empfängt Anfrage mit der Datei und druckt ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)]), aber beim Senden der Datei mit dem UTF-8-Dateinamen scheint der Server die Datei nicht zu empfangen, wie es ImmutableMultiDict([]) druckt.

Ich verwende Anfragen 2.3.0 aber das Problem mit der neuesten Version nicht so gut lösen (2.8.1), ist Flask Version 0.10.1 und Flask-RESTful-Version ist 0.3.4.

Ich habe etwas graben in requests Code und die Anfrage scheint in Ordnung gesendet werden (dh mit der Datei), und ich druckte die Anfrage direkt vor dem Senden und sehen Sie den Dateinamen wurde tatsächlich nach RFC2231 codiert:

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

um die Dinge zusammenzufassen, ich bin nicht ganz sicher, ob das Problem innerhalb requests liegt, die nicht ordnungsgemäß die Datei auf die Anforderung oder wenn Flask ist mit Probleme mit Aufnahme von Dateien mit Dateinamen nicht anhängen, die codiert nach RFC2231.

UPDATE: kamen in dieser Ausgabe in requests GitHub: https://github.com/kennethreitz/requests/issues/2505

+0

Da die Anfrage in Ordnung ist, muss dies der Server sein. Die Frage sieht für mich wie eine normale Debugging-Aufgabe aus. Fügen Sie hier und da einige Breakpoints/Debug-Druck hinzu, um die spezifische Codezeile, die es falsch macht, zu lokalisieren. –

+0

so Anforderungen codiert die Dateinamen auf eine Weise, die Kolben nicht unterstützt? – mehdy

Antwort

1

ich dieses Problem umgehen, indem Sie die Datei manuell mit read() zu lesen und dann seinen Inhalt zu veröffentlichen:

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

Ich denke, vielleicht gibt es Verwirrung hier auf Codierung hier -

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 

Um die zweite an den Server zu senden, was Sie tun wollen, ist dies: wenn

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

Ich bin ein wenig überrascht, dass es keinen Fehler werfen auf dem Client versucht, die Datei zu öffnen - Sie nichts sehen auf dem Client-Ende zeigt einen Fehler an?

EDIT: Eine einfache Möglichkeit, meine Idee zu bestätigen oder zu leugnen ist natürlich, den Inhalt aus dem Inneren des Clients auszudrucken, um sicherzustellen, dass es richtig gelesen wird.