Comment fonctionnent les téléchargements en pause?

19

J'utilise Internet Download Manager (IDM) pour télécharger des données, et j'ai remarqué que dans sa fenêtre de progression de téléchargement, il indique si un téléchargement peut être mis en pause (reprise). En règle générale, les sites de partage de fichiers ne permettent pas la reprise du transfert si la connexion est rompue.

La question est donc la suivante: comment cela fonctionne-t-il? Est-ce une configuration effectuée sur le serveur? En quoi cela diffère-t-il des téléchargements torrent, où le téléchargement peut toujours être repris.

Rafay
la source

Réponses:

27

Du point de vue du codage, un téléchargement n'est qu'un tableau d'octets inclus dans le flux de réponse HTTP.

Le protocole HTTP 1.1 (voir page 30) comprend un champ dans l'en-tête appelé «Range», qui permet à la demande de spécifier le décalage en octets et la longueur de la réponse demandée.

Donc, en substance, vous pouvez dire: "donnez-moi l'objet HTTP à cette URL, mais je ne veux que les 1024e à 4096e octets". Le navigateur client ajoute ensuite le flux d'octets à la partie du fichier déjà téléchargée. Le client peut dire où il doit reprendre simplement en vérifiant la longueur du fichier déjà téléchargé et l'incrémente pour déterminer le décalage requis.

Quant à savoir comment votre gestionnaire de téléchargement peut le dire, il envoie une requête HTTP "HEAD". Si le code de réponse est 206 (contenu partiel), le flux http prend en charge la reprise.

Frank Thomas
la source
FTP est également un protocole couramment utilisé pour transférer des fichiers. Auparavant, c'était le moyen principal, bien que maintenant HTTP soit probablement plus courant.
ChrisInEdmonton
FTP utilise essentiellement la même construction, mais je devrais rechercher les détails avant d'essayer d'implémenter du code qui l'utilise.
Frank Thomas
1

Cela peut être géré à l'aide d'un cookie persistant , à ne pas confondre avec un cookie de session ou vous pouvez utiliser [Viewstate] si le site est construit sur ASP.NET, mais ce n'est pas une bonne pratique. Frank Thomas a la meilleure réponse.

Josh Campbell
la source
1
Je ne suis pas sûr de la raison pour laquelle cette réponse a été déclassée, alors je l'ai votée à la hausse.
Ramhound
@FrankThomas, je viens de confirmer certains faits avec notre développeur principal et il a dit que vous pouviez utiliser un cookie persistant ou un état d'affichage pour stocker les informations d'index du tableau d'octets utilisées pour suivre et reprendre le téléchargement via un téléchargeur basé sur un navigateur, mais ce n'était pas le cas une bonne pratique. En règle générale, pour les gros fichiers pouvant être repris, comme un produit MS, vous téléchargez une application de gestionnaire de téléchargement et cela fonctionne comme vous l'avez dit. J'ai voté pour votre réponse.
Josh Campbell
Cette réponse semble dénuée de sens. Ce n'est pas un problème de déterminer la quantité de fichier téléchargée; le client le sait déjà. Vous pouvez le communiquer au serveur à l'aide d'un cookie, mais il existe de bien meilleures approches. En-têtes, paramètres GET ou POST, etc. La question est de savoir comment le transfert de fichiers reprend, pas comment transmettre des informations à un serveur.
ChrisInEdmonton
Le PO a demandé comment cela fonctionnait et je l'ai dirigé vers les cookies afin qu'il puisse poursuivre ses recherches. Il existe une douzaine de façons différentes pour un développeur de créer un téléchargeur de reprise. Je l'aurais fait en utilisant des cookies sur le client pour suivre l'état du téléchargement via un index start-stop et utilisé C # sur le backend pour calculer combien a été téléchargé (de l'index X à l'index Y) puis repris à partir de Y. Un téléchargement sur le bureau Le gestionnaire fait exactement la même chose, mais il stocke ses informations dans un fichier texte ou une base de données. Ce n'est pas stackoverflow, je n'écris pas de code source.
Josh Campbell
@JoshCampbell, le problème est que votre solution ne fonctionnerait que pour les personnes utilisant votre logiciel client et serveur spécifique. Il existe des moyens standard de résoudre ce problème, comme le souligne Frank dans sa réponse, et il n'est pas nécessaire d'en coder un. De plus, votre réponse n'indique pas le processus par lequel certains sites permettent à l'OP de reprendre les téléchargements et ne répond donc pas à la question. C'est pourquoi j'ai commenté.
ChrisInEdmonton