Wiederaufnahme abgebrochener Downloads?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
.:TBX:.
User
Beiträge: 5
Registriert: Freitag 20. August 2010, 13:45

Wie kann man das bewerkstelligen?

Habe auch keine Idee dafür. :K

Hat jemand evt. schon soetwas gemacht oder wo finde ich darüber Informationen?
Tante Google spuckt da nicht viel aus. :roll:
BlackJack

@.:TBX:.: Das kommt auf's Protokoll drauf an und ob der Server es unterstützt. Die Details sind in den RFCs zu den Protokollen zu finden.
.:TBX:.
User
Beiträge: 5
Registriert: Freitag 20. August 2010, 13:45

Gesetz dem Fall es wird unterstützt. :? (bin mir aber ned sicher)

Muß dann ja von dem File was auf Platte ist die größe bestimmen. (kleinste Übel :D )
Dann die DL Adr. aufrufen und nochmal laden ???

Geht ja ned weil das File ja dann überschrieben wird. :(

Also fehlt da nochwas zwischen. Aus den RFC werd ich ned so recht schlau. :?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also wenns um HTTP geht, dann kennt HTTP auch den Header Content-Range, da kannst du angeben ab wo du die Datei lesen willst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Leonidas hat geschrieben:Content-Range
`Content-Range` ist, das was vom Server zurückkommt. Der Client schickt `Range`. Hier mal ein Exempel:

Code: Alles auswählen

import urllib2

RELATIVE_TO_END = 2

url = 'http://cdimage.ubuntu.com/daily/20100925/maverick-alternate-amd64.template'

dest = open('blah', 'a')
dest.seek(0, RELATIVE_TO_END)
already_received = dest.tell()

try:
    req = urllib2.Request(url)
    req.add_header('Range', 'bytes=%d-' % already_received)
    sock = urllib2.urlopen(req)
    while True:
        data = sock.read(8*1024)
        if not data:
            break
        dest.write(data)
        read_bytes += len(data)
finally:
    sock.close()
    dest.close()
Kannste ja mal ausprobieren, einfach das Programm ab und zu mal unterbrechen und neu starten. Der Download wird korrekt fortgesetzt.
Benutzeravatar
snafu
User
Beiträge: 6834
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Aus welchem Grund gehst du den Weg über `seek()` und `tell()`? Gibt das hier andere Ergebnisse als `os.path.getsize()`?
lunar

@snafu: Andere Ergebnisse wohl nicht, aber öffnen muss man die Zieldatei ja sowieso, also kann man mit ".tell()" einen "stat()"-Aufruf sparen.

"a" ist allerdings nicht nötig, da sowieso zum Ende gesprungen wird. Außerdem muss die Datei binär geöffnet werden, "wb" wäre also der richtige Modus. Die Schleife zum Kopieren der Bytes kann man mit "iter()" eleganter und ohne Endlosschleife formulieren, oder am besten gleich vollständig durch "shutil.copyfileobj" ersetzen. Zum Schluss natürlich noch der obligatorisch Hinweis auf "with", vor allem, da der Quelltext in dieser Form einen UnboundLocalError wirft, wenn das Öffnen der URL fehlschlägt.

Direkt übernehmen sollte man den Quelltext daher nicht.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

War ja auch nur eine Gedankennotiz. Ich dachte allerdings, dass "w" die Datei stets überschreibt.
lunar

Stimmt, daran habe ich gar nicht gedacht. Mein Fehler ... :|
Antworten