Wie funktionieren pausenfähige Downloads?

19

Ich verwende den Internet Download Manager (IDM) zum Herunterladen von Daten und habe festgestellt, dass im Fenster für den Download-Fortschritt angezeigt wird, ob ein Download angehalten (fortgesetzt) ​​werden kann oder nicht. Bei Sites mit gemeinsamer Nutzung von Dateien kann die Übertragung normalerweise nicht fortgesetzt werden, wenn die Verbindung unterbrochen wird.

Die Frage ist also: Wie funktioniert das? Ist es eine Konfiguration, die auf dem Server ausgeführt wird? Wie unterscheidet sich dies von Torrent-Downloads, bei denen der Download immer fortgesetzt werden kann?

Rafay
quelle

Antworten:

27

Aus Codierungssicht ist ein Download nur ein Byte-Array, das im HTTP-Antwort-Stream enthalten ist.

Das HTTP 1.1-Protokoll (siehe Seite 30) enthält ein Feld im Header mit der Bezeichnung "Range" (Bereich), in dem die Anforderung den Byte-Offset und die Länge der angeforderten Antwort angeben kann.

Im Wesentlichen können Sie also sagen: "Geben Sie mir das HTTP-Objekt unter dieser URL, aber ich möchte nur die 1024. - 4096. Bytes davon". Der Client-Browser hängt dann den Byte-Stream an den bereits heruntergeladenen Teil der Datei an. Der Client kann erkennen, wo er fortfahren muss, indem er einfach die Länge der bereits heruntergeladenen Datei überprüft und diese inkrementiert, um den erforderlichen Versatz zu bestimmen.

Ihr Download-Manager sendet eine HTTP-Anforderung "HEAD". Wenn der Antwortcode 206 (Teilinhalt) ist, unterstützt der http-Stream die Wiederaufnahme.

Frank Thomas
quelle
FTP ist auch ein häufig verwendetes Protokoll zum Übertragen von Dateien. Früher war es das primäre Mittel, heute ist HTTP wahrscheinlich häufiger anzutreffen.
ChrisInEdmonton
FTP verwendet im Wesentlichen das gleiche Konstrukt, obwohl ich die Details nachschlagen musste, bevor ich versuchen würde, Code zu implementieren, der es verwendet.
Frank Thomas
1

Dies kann mithilfe eines permanenten Cookies geschehen , das nicht mit einem Sitzungscookie verwechselt werden darf, oder Sie können [Viewstate] verwenden, wenn die Site auf ASP.NET basiert. Dies ist jedoch keine gute Vorgehensweise. Frank Thomas hat die beste Antwort.

Josh Campbell
quelle
1
Ich bin nicht sicher, warum diese Antwort abgelehnt wurde, also habe ich sie abgelehnt.
Ramhound
@FrankThomas, ich habe gerade einige Fakten mit unserem leitenden Entwickler bestätigt und er sagte, Sie könnten ein persistentes Cookie oder einen Viewstate verwenden, um die Indexinformationen des Bytearrays zu speichern, die zum Verfolgen und Wiederaufnehmen des Downloads über einen browserbasierten Downloader verwendet werden. Dies war jedoch nicht der Fall eine gute Übung. In der Regel laden Sie für große, wiederverwendbare Dateien, wie z. B. ein MS-Produkt, eine Download-Manager-Anwendung herunter, und sie funktioniert genau so, wie Sie es gesagt haben. Ich habe Ihre Antwort positiv bewertet.
Josh Campbell
Diese Antwort erscheint bedeutungslos. Es ist kein Problem festzustellen, wie viel der Datei heruntergeladen wurde. das weiß der kunde schon. Sie können dies über ein Cookie an den Server zurückmelden, aber es gibt weitaus bessere Ansätze. Header, GET- oder POST-Parameter usw. Die Frage lautet, wie die Dateiübertragung fortgesetzt wird und nicht, wie Informationen an einen Server übergeben werden.
ChrisInEdmonton
Das OP fragte, wie es funktioniert und ich wies ihn in Richtung Cookies, damit er weitere Nachforschungen anstellen könne. Es gibt ein Dutzend verschiedene Möglichkeiten, wie ein Entwickler einen fortsetzbaren Downloader erstellen kann. Ich hätte es mithilfe von Cookies auf dem Client gemacht, um den Downloadstatus über einen Start-Stopp-Index zu verfolgen, und mithilfe von C # auf dem Back-End berechnet, wie viel heruntergeladen wurde (von Index X nach Index Y) und anschließend von Y fortgesetzt wurde. Ein Desktop-Download Manager macht genau dasselbe, nur speichert er seine Informationen in einer Textdatei oder Datenbank. Dies ist kein Stackoverflow, ich schreibe keinen Quellcode.
Josh Campbell
@ JoshCampbell, das Problem ist, dass Ihre Lösung nur für Benutzer funktioniert, die Ihre spezifische Client- und Serversoftware verwenden. Wie Frank in seiner Antwort hervorhebt, gibt es Standardmethoden, um dieses Problem zu lösen, und es ist nicht erforderlich, eine benutzerdefinierte Codierung vorzunehmen. Darüber hinaus weist Ihre Antwort nicht auf den Prozess hin, mit dem einige Websites dem OP ermöglichen, Downloads fortzusetzen, und beantwortet daher die Frage nicht. Deshalb habe ich kommentiert.
ChrisInEdmonton