2014-04-06 11 views
9

Sto usando il modulo richieste Python 2.7 per scaricare un file binario usando il seguente codice, come rendere questo codice "auto-resume" il download da file parzialmente scaricato.Come riprendere il download del file in Python?

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

io preferirei usare solo requests modulo per raggiungere questo obiettivo, se possibile.

risposta

12

Se il server web supporta la richiesta gamma allora si può aggiungere l'intestazione Range per la vostra richiesta:

Range: bytes=StartPos-StopPos 

Riceverai la parte compresa tra StartPos e StopPos. Se non conoscete le StopPos basta usare:

Range: bytes=StartPos- 

Così il vostro codice sarebbe:

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

Si sarebbe anche bisogno di cambiare la modalità di file da 'wb' a 'ab' (per aggiungere, altrimenti si sovrascriverà la parte già salvata). –

+0

Per riferimento futuro, sarebbe il resume_byte_pos, essere la dimensione corrente del file, o la dimensione corrente del file meno uno? – Klik

+1

@Klik sicuramente non una dimensione di file corrente meno uno - se hai scaricato 0 byte allora non vuoi iniziare da -1 :) L'indicizzazione avvia il modulo 0, quindi devi inviare la dimensione del file corrente come byte iniziale. –

Problemi correlati