2015-11-15 8 views
10

मैंने SO पर कई संबंधित प्रश्नों के माध्यम से पढ़ा है लेकिन एक समाधान समाधान खोजने में कामयाब नहीं रहा। क्लाइंट में फिरपायथन-अनुरोध यूनिकोड फ़ाइल नामों के साथ पोस्ट

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) 

:

मैं इस सरलीकृत कोड के साथ एक बोतल सर्वर है

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

जब गैर utf-8 फ़ाइल नाम के साथ पहले अनुरोध भेजने के सर्वर प्राप्त करता है फ़ाइल के साथ अनुरोध करें और ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)]) प्रिंट करें, लेकिन utf-8 फ़ाइल नाम के साथ फ़ाइल भेजते समय सर्वर को फ़ाइल प्राप्त नहीं होती है क्योंकि यह ImmutableMultiDict([]) प्रिंट करता है।

मैं अनुरोध 2.3.0 उपयोग कर रहा हूँ, लेकिन समस्या के रूप में अच्छी तरह से (2.8.1) नवीनतम संस्करण के साथ हल नहीं होती, बोतल संस्करण 0.10.1 है और कुप्पी के RESTful संस्करण 0.3.4 है।

मैंने requests कोड में कुछ खुदाई की है और अनुरोध ठीक से भेजा गया है (यानी फ़ाइल के साथ), और मैंने अनुरोध भेजने से ठीक पहले अनुरोध मुद्रित किया और फ़ाइल नाम वास्तव में आरएफसी 2231 को एन्कोड किया गया था:

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

बातें सारांश में, मैं पूरी तरह यकीन नहीं करता है, तो समस्या requests के भीतर निहित है कि ठीक से अनुरोध करने के लिए फ़ाइल संलग्न नहीं है या अगर Flask फ़ाइल नाम हैं कि के साथ फ़ाइलों को उठा के साथ मुद्दों कर रहा है आरएफसी 2231 के अनुसार एन्कोडेड।

अद्यतन:requests GitHub में इस मुद्दे भर में आया: https://github.com/kennethreitz/requests/issues/2505

+0

चूंकि अनुरोध ठीक है, यह सर्वर होना चाहिए। सवाल मेरे लिए रन-ऑफ-द-मिल डीबगिंग कार्य जैसा दिखता है। कोड की विशिष्ट पंक्ति को गलत तरीके से इंगित करने के लिए यहां कुछ और ब्रेकपॉइंट्स/डीबग प्रिंटिंग जोड़ें जो गलत है। –

+0

तो अनुरोध फ़ाइल नामों को इस तरह से एन्कोड करता है कि फ्लास्क समर्थन नहीं करता है? – mehdy

उत्तर

1

मैं मैन्युअल read() साथ फ़ाइल को पढ़ने और फिर उसकी सामग्री पोस्ट करके इस समस्या को वैकल्पिक हल:

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

मुझे लगता है कि शायद भ्रम है यहां एन्कोडिंग पर -

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 

आप कुछ भी नहीं देखते हैं -

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

मैं एक छोटे से हैरान है कि यह हालांकि फ़ाइल खोलने का प्रयास ग्राहक पर एक त्रुटि फेंक नहीं है कर रहा हूँ: सर्वर आप क्या करना चाहते क्या करने के लिए एक दूसरे के भेजने के लिए इस है क्लाइंट एंड पर एक त्रुटि का संकेत है?

संपादित करें: मेरे विचार की पुष्टि या इनकार करने का एक आसान तरीका क्लाइंट के अंदर से सामग्री को मुद्रित करना है ताकि यह ठीक से पढ़ा जा सके।

संबंधित मुद्दे