2010-03-29 12 views
13

मैं कुछ फ़ाइलों को HttpResponse में वापस करना चाहता हूं और मैं निम्न फ़ंक्शन का उपयोग कर रहा हूं। फ़ाइल जो हमेशा लौटाई जाती है, में 1kb का फाइलसाइज होता है और मुझे नहीं पता कि क्यों। मैं फ़ाइल खोल सकता हूं, लेकिन ऐसा लगता है कि यह सही तरीके से परोसा नहीं जाता है। इस प्रकार मैं जानना चाहता था कि कैसे एक HttpResponse पर django/पायथन के साथ फाइलें वापस कर सकते हैं।django HttpResponse पर फ़ाइल लौटाएं - फ़ाइल सही ढंग से नहीं दी गई है

@login_required 
def serve_upload_files(request, file_url): 
    import os.path 
    import mimetypes 
    mimetypes.init() 

    try: 
     file_path = settings.UPLOAD_LOCATION + '/' + file_url 
     fsock = open(file_path,"r") 
     #file = fsock.read() 
     #fsock = open(file_path,"r").read() 
     file_name = os.path.basename(file_path) 
     file_size = os.path.getsize(file_path) 
     print "file size is: " + str(file_size) 
     mime_type_guess = mimetypes.guess_type(file_name) 
     if mime_type_guess is not None: 
      response = HttpResponse(fsock, mimetype=mime_type_guess[0]) 
     response['Content-Disposition'] = 'attachment; filename=' + file_name    
    except IOError: 
     response = HttpResponseNotFound() 
    return response 

संपादित करें: बग वास्तव में एक बग ;-)

यह समाधान एक अपाचे सर्वर पर उत्पादन में काम कर रहा है नहीं है, इस प्रकार स्रोत ठीक है।

इस प्रश्न को लिखते समय मैंने इसे django विकास सर्वर के साथ स्थानीय परीक्षण किया और यह सोच रहा था कि यह क्यों काम नहीं करता है। मेरे एक दोस्त ने मुझे बताया कि माइम प्रकार सर्वर में सेट नहीं होने पर यह समस्या उत्पन्न हो सकती है। लेकिन उसे यकीन नहीं था कि यह समस्या है या नहीं। लेकिन निश्चित रूप से एक बात .. यह सर्वर के साथ कुछ करने के लिए है।

+8

जो लोग इस कोड का उपयोग करने का प्रयास करते हैं, उनके लिए ध्यान रखें कि 'HttpResponse' में' mimetype' तर्क 'content_type' फ़ील्ड के साथ बदल दिया गया है। –

उत्तर

9

इटेटरेटर HttpResponse() पर पैरामीटर के रूप में write() विधि के बजाय पैरामीटर के रूप में पारित करने का प्रयास करें, जो मुझे लगता है कि एक स्ट्रिंग की अपेक्षा करता है।

response = HttpResponse(fsock, mimetype=...) 

देखें http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

इसके अलावा, मुझे यकीन है कि आप response लौटने से पहले अपनी फ़ाइल पर close कॉल करना चाहते हैं नहीं कर रहा हूँ। इस शेल में इसके साथ खेला जाने के बाद (मैंने इसे वास्तविक Django व्यू में नहीं देखा है), ऐसा लगता है कि response फ़ाइल तक नहीं पहुंचता है जब तक कि response स्वयं पढ़ा नहीं जाता है। को पढ़ने वाली फ़ाइल का उपयोग करके बनाई गई फ़ाइल का उपयोग करके ValueError: I/O operation on closed file में परिणाम बंद हो गए हैं।

तो, आप fsock खोलना चाहेंगे, और प्रतिक्रिया पढ़ने के बाद कचरा कलेक्टर इसके साथ सौदा कर सकता है।

+0

हाय, आपके उत्तर के लिए धन्यवाद। दुर्भाग्य से यह कुछ भी नहीं बदलता है। प्रतिक्रिया = HttpResponse (fsock, mimetype = mime_type_guess [0])। फ़ाइल अभी भी सही ढंग से परोसा नहीं है। इसके अतिरिक्त मैंने फ़ाइल आकार (फ़ाइल_साइज = os.path.getsize (file_path) प्रिंट के साथ "फ़ाइल आकार है:" + str (file_size)) के साथ इसे HttpResponse पर वापस करने से पहले और यह लौटाता है: फ़ाइल का आकार है: 56349। इस प्रकार फ़ाइल फ़ाइल सिस्टम से सही ढंग से पढ़ी जाती है और जब इसे वापस किया जाता है तो कुछ गलत हो जाता है। –

+0

टॉम टॉम, मेरे उत्तर में जोड़ देखें। –

+0

मैं बेन से सहमत हूं। जब HspResponse में fsock जोड़ा जाता है, या तो कन्स्ट्रक्टर में या 'लिखने' विधि का उपयोग करके, यह सामग्री के आंतरिक ढेर में जोड़ा जाता है जो HttpResponse बनाए रखता है। उस स्टैक का मूल्यांकन तब तक नहीं किया जाता जब तक कि वास्तव में प्रतिक्रिया की आवश्यकता न हो, आखिरी संभव पल में।आपको fsock को खोलने की आवश्यकता होगी या अन्यथा HttpResponse इसे पढ़ने का प्रयास करते समय एक त्रुटि उठाएगा। कचरा कलेक्टर फाइल को बंद करने का ख्याल रखेगा। –

11

क्या यह हो सकता है कि फ़ाइल में कुछ गैर-असीसी वर्ण हैं जो उत्पादन में ठीक है लेकिन विकास में नहीं हैं?

fsock = open(file_path,"rb") 
+3

आप मेरे उद्धारक हैं! विंडोज़ से सेवा करते समय Django के माध्यम से फाइलों की सेवा करने के लिए सभी मुख्य पोस्ट इस बाइनरी आवश्यकता को कवर नहीं करते हैं। वैसे, फ़ाइल रैपर का उपयोग करते समय "आरबी" काम करना के माध्यम से भागों की सेवा के लिए: वापसी HttpResponse (FileWrapper (खुला (फ़ाइल नाम, "आरबी")), content_type = mimetypes.guess_type (फ़ाइल नाम) [0]) – garromark

1

settings.py में अपने MIDDLEWARE_CLASSES से "django.middleware.gzip.GZipMiddleware" अक्षम करने

मैं एक ही समस्या थी प्रयास करें, और के बाद मैंने देखा:

बाइनरी के रूप में फ़ाइल को पढ़ने की कोशिश करो मिडलवेयर फ़ोल्डर के आस-पास, यह मिडलवेयर मेरे लिए दोषी लग रहा था और इसे हटाने के लिए मेरे लिए चाल थी।

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