2015-11-15 22 views
10

SO ile ilgili birçok sorularımı okudum, ancak çalışan bir çözüm bulmayı başaramadım. istemci Sonrapython istekleri, unicode dosya adlarıyla gönder

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) 

:

Bu basitleştirilmiş koduyla bir Matara sunucusu var

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

olmayan utf-8 dosya adıyla ilk isteği göndererek sunucusunun aldığı dosya ile istek ve ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)]) yazdırır, ancak dosyayı utf-8 dosya adı ile gönderirken sunucu ImmutableMultiDict([]) yazdırılırken dosyayı almıyor gibi görünüyor.

Ben istekleri 2.3.0 kullanıyorum ama sorun yanı (2.8.1) son sürümü ile çözmezse, Flask versiyonu 0.10.1 ve Matara-RESTful sürüm 0.3.4 olduğunu.

requests kodunda bazı kazı yaptım ve istek gönderilmeyecek gibi görünüyor (yani dosyayla birlikte) ve istek gönderilmeden hemen önce yazdırıldım ve dosya adının gerçekten RFC2231 olarak kodlandığını görüyorum: sorun düzgün isteğine dosya eklemek değil veya Flask eğer dosya adlarına sahip dosyaları toplayıp ile sorunları olması o requests içinde yatıyor eğer

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

Ben tamamen emin değilim şeyler Özetle RFC2231'e göre kodlanmıştır.

GÜNCELLEME:requests GitHub'dan bu konuda genelinde geldi: https://github.com/kennethreitz/requests/issues/2505

+0

İstek tamam olduğundan, bu sunucu olmalıdır. Soru, benim için bir değirmencilik hata ayıklama görevi gibi görünüyor. Burada yanlış yapan belirli bir kod satırını kesin olarak belirlemek için burada ve bazı yazdırma noktaları ekleyin. –

+0

böylece istekler dosya isimlerini desteklemeyecek şekilde kodlar mı? – mehdy

cevap

1

el read() dosyayı okuma ve içeriğini yayınlayarak bu sorunu gidermek:

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

belki karışıklık olduğunu düşünüyorum Burada kodlamada - Buraya tıklayın - ( ) Eğer bir şey görmüyorum -

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

Gerçi dosyayı açmaya çalışırken istemci üzerinde bir hata atmak etmediğini biraz şaşırdım: Eğer ne yapmak istediğini sunucuya ikinci bir göndermek için bu istemci ucunda bir hata olduğunu belirten?

DÜZENLEME: Fikrimi doğrulamak veya reddetmenin kolay bir yolu, elbette doğru bir şekilde okunmasını sağlamak için içeriğin istemcinin içinden çıktısını almaktır.