2015-11-15 28 views
10

Przeczytałem kilka powiązanych pytań tutaj na SO, ale nie udało się znaleźć działającego rozwiązania.python-request post z nazwą pliku Unicode

Mam serwer kolby z tym kodem uproszczonej:

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) 

Następnie w kliencie:

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

Po wysłaniu pierwszego żądania ze nie UTF-8 pliku serwer odbiera Żądanie z plikiem i wydruki ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)]), ale podczas wysyłania pliku z nazwą pliku utf-8 serwer wydaje się nie odbierać pliku po wydrukowaniu ImmutableMultiDict([]).

używam żądania 2.3.0 ale problem nie zostanie rozwiązany przy użyciu najnowszej wersji, jak również (2.8.1), wersja kolby 0.10.1 i wersja Kolba-relaksującego jest 0.3.4.

Zrobiłem kilka kopania w kodzie , a żądanie wydaje się być wysłane ok (tj. Z plikiem), a ja wydrukowałem żądanie tuż przed wysłaniem i widzę, że nazwa pliku została rzeczywiście zakodowana dla RFC2231:

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

Podsumowując rzeczy, nie jestem do końca pewien, czy problem leży w requests że nie prawidłowo dołączyć plik na żądanie lub jeśli Flask mających problemy z podnoszenia pliki z nazwami plików, które są kodowane zgodnie z RFC2231.

UPDATE: Natknąłem tej kwestii w requests GitHub: https://github.com/kennethreitz/requests/issues/2505

+0

Ponieważ żądanie jest w porządku, musi to być serwer. Pytanie wygląda dla mnie jak zadanie związane z debugowaniem run-of-the-mill. Dodaj punkty przerwania/debugowanie drukowania tu i tam, aby ostatecznie wskazać konkretną linię kodu, która robi to źle. –

+0

, więc żądania kodują nazwy plików w sposób, w jaki nie działa kolba? – mehdy

Odpowiedz

1

mogę rozwiązać ten problem, ręcznie odczytu pliku z read() a następnie opublikowania jego zawartość:

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

Myślę, że może tam zamieszanie tutaj na kodowanie tutaj -

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 

Aby wysłać drugi do serwera, co chcesz zrobić to w ten sposób:

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

Jestem trochę zaskoczony, że nie rzuca błąd na klienta próbuje otworzyć plik, chociaż - nic nie widać po stronie klienta wskazującej błąd?

EDYCJA: Prostym sposobem na potwierdzenie lub odrzucenie mojego pomysłu jest oczywiście wydrukowanie zawartości z wnętrza klienta, aby upewnić się, że jest poprawnie czytany.

Powiązane problemy