2014-04-06 3 views
9

Ich benutze Python 2.7 Requests-Modul, um eine Binärdatei mit dem folgenden Code herunterladen, wie dieser Code "Auto-Lebenslauf" den Download von teilweise heruntergeladenen Datei.Wie kann der Dateidownload in Python fortgesetzt werden?

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() 

Ich würde es vorziehen, nur requests Modul zu verwenden, um dies zu erreichen, wenn möglich.

Antwort

12

Wenn der Web-Server die Bereichsanforderung unterstützt, dann können Sie die Range-Header in der Anfrage hinzugefügt:

Range: bytes=StartPos-StopPos 

Sie das Teil zwischen StartPos und StopPos erhalten. Wenn Sie nicht den StopPos wissen nur verwenden:

Range: bytes=StartPos- 

So würde Ihr Code sein:

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

Sie müssten auch von ‚wb‘ auf ‚ab‘ den Dateimodus ändern (anhängen, sonst Sie überschreibt den bereits gespeicherten Teil). –

+0

Für zukünftige Referenz, wäre die resume_byte_pos, die aktuelle Größe der Datei oder die aktuelle Größe der Datei minus eins? – Klik

+1

@Klik sicher nicht eine aktuelle Dateigröße minus eins - wenn Sie 0 Bytes heruntergeladen haben, dann wollen Sie nicht von -1 beginnen :) Indexing startet Formular 0, so sollten Sie aktuelle Dateigröße als Startbyte senden. –

Verwandte Themen