2009-09-19 7 views
5

यदि Python2.6 में लिखे गए एक HTTP-सर्वर-सर्वर में फ़ाइल तक स्थानीय पहुंच है, तो अनुरोध के लिए उस सर्वर के लिए फ़ाइल को वापस करने के लिए सर्वर का सबसे सही तरीका क्या होगा?पाइथन का उपयोग करके HTTP, अच्छे तरीके से फ़ाइल कैसे भेजें?

मान लीजिए कि इस वर्तमान स्थिति है दो:

header('Content-Type', file.mimetype) 
header('Content-Length', file.size) # file size in bytes 
header('Content-MD5', file.hash) # an md5 hash of the entire file 

return open(file.path).read() 

सभी फ़ाइलें ज़िप या .rar अभिलेखागार मेगाबाइट की एक जोड़ी से बड़ी नहीं कर रहे हैं।

वर्तमान स्थिति के साथ, ब्राउज़र आने वाले डाउनलोड को अजीब तरीके से संभालते हैं। कोई ब्राउज़र फ़ाइल का नाम नहीं जानता है, उदाहरण के लिए, इसलिए वे एक यादृच्छिक या डिफ़ॉल्ट का उपयोग करते हैं। (फ़ायरफ़ॉक्स ने फ़ाइल को एक .part एक्सटेंशन के साथ भी सहेजा, भले ही यह पूर्ण और पूरी तरह से उपयोग योग्य हो।)

इस और अन्य त्रुटियों को ठीक करने का सबसे अच्छा तरीका क्या होगा, मुझे अभी भी पता नहीं हो सकता है?

मैं कौन से शीर्षलेख भेज नहीं रहा हूं?

धन्यवाद!

+3

"कोई ब्राउजर फ़ाइल का नाम नहीं जानता है, उदाहरण के लिए, इसलिए वे एक यादृच्छिक या डिफ़ॉल्ट का उपयोग करते हैं।" सामग्री-विस्थापन हेडर इसे संभालता है, नहीं? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

उत्तर

6

इस तरह मैं ज़िप फ़ाइल को भेजने,

req.send_response(200) 
    req.send_header('Content-Type', 'application/zip') 
    req.send_header('Content-Disposition', 'attachment;' 
        'filename=%s' % filename) 

अधिकतर ब्राउज़र इसे सही ढंग से संभाल।

1

आप प्रतिक्रिया शरीर (अर्थात, अगर आप अपने ढांचे द्वारा प्रतिक्रिया शरीर के लिए एक धारा दिए गए हैं) आप कुछ इस तरह के साथ स्मृति में फ़ाइल पकड़े बच सकते हैं वापस जाने के लिए नहीं है, तो:

fp = file(path_to_the_file, 'rb') 
while True: 
    bytes = fp.read(8192) 
    if bytes: 
     response.write(bytes) 
    else: 
     return 

आप किस वेब ढांचे का उपयोग कर रहे हैं?

+0

मैं वेबपी का उपयोग कर रहा हूं। चूंकि यह फ़ाइल डिस्क्रिप्टर का खुलासा नहीं कर रहा है, मेरा अनुमान है कि मैं धीरे-धीरे फ़ाइल उत्पन्न कर सकता हूं? –

+1

ऐसा लगता है कि web.py लेखकों ने क्या सिफारिश की है: http://webpy.org/cookbook/streaming_large_files – dcrosta

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