2014-04-06 7 views
9

मैं निम्नलिखित कोड का उपयोग कर एक बाइनरी फ़ाइल डाउनलोड करने के लिए पाइथन 2.7 अनुरोध मॉड्यूल का उपयोग कर रहा हूं, इस कोड को आंशिक रूप से डाउनलोड की गई फ़ाइल से डाउनलोड "ऑटो-रेज़्यूमे" कैसे करें।पायथन में फ़ाइल डाउनलोड कैसे फिर से शुरू करें?

r = requests.get(self.fileurl, stream=True, verify=False, allow_redirects=True) 
if r.status_code == 200: 
    CHUNK_SIZE = 8192 
    bytes_read = 0 
    with open(FileSave, 'wb') as f: 
     itrcount=1 
     for chunk in r.iter_content(CHUNK_SIZE): 
      itrcount=itrcount+1 
      f.write(chunk) 
      bytes_read += len(chunk) 
      total_per = 100 * float(bytes_read)/float(long(audioSize)+long(videoSize)) 


      self.progress_updates.emit('%d\n%s' % (total_per, 'Download Progress : ' + self.size_human(itrcount*CHUNK_SIZE) + '/' + Total_Size)) 
r.close() 

मैं यदि संभव हो तो इस लक्ष्य को हासिल करने के लिए केवल requests मॉड्यूल का उपयोग करना पसंद करेंगे।

उत्तर

12

वेब सर्वर तो आप अपने अनुरोध करने के लिए रेंज हेडर जोड़ सकते हैं रेंज अनुरोध का समर्थन करता है, तो:

Range: bytes=StartPos-StopPos 

आप StartPos और StopPos के बीच हिस्सा प्राप्त होगा। न StopPos जानते हैं, बस का उपयोग करें:

Range: bytes=StartPos- 

तो अपने कोड होगा:

def resume_download(fileurl, resume_byte_pos): 
    resume_header = {'Range': 'bytes=%d-' % resume_byte_pos} 
    return requests.get(fileurl, headers=resume_header, stream=True, verify=False, allow_redirects=True) 
+4

तुम भी 'पश्चिम बंगाल' से 'अब' के लिए फ़ाइल मोड बदलने के लिए की आवश्यकता होगी (संलग्न करने के लिए, अन्यथा आप पहले से ही सहेजे गए हिस्से को ओवरराइट कर देगा)। –

+0

भविष्य के संदर्भ के लिए, resume_byte_pos, फ़ाइल का वर्तमान आकार, या फ़ाइल का वर्तमान आकार शून्य से एक होगा? – Klik

+1

@Klik निश्चित रूप से वर्तमान फ़ाइल आकार शून्य से नहीं - यदि आपने 0 बाइट डाउनलोड किए हैं तो आप -1 से शुरू नहीं करना चाहते हैं :) इंडेक्सिंग फॉर्म 0 शुरू होता है, इसलिए आपको बाइट शुरू करने के रूप में वर्तमान फ़ाइल आकार भेजना चाहिए। –

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