Télécharger de gros fichiers à partir de l'adresse HTTP cv/relance soutien .NET?
Comment mettre en œuvre le téléchargement d'un gros fichier (~500 MO) à partir de l'adresse HTTP dans mon application? Je veux soutenir la reprise automatique/nouvelle tentative, de sorte que lorsque la connexion est interrompue, ma demande peut essayer de se reconnecter pour obtenir le fichier et d'éviter de re-télécharger le fichier téléchargé partie, si possible (je sais, cela dépend du serveur).
Ce qui est similaire au comportement des gestionnaires de téléchargement et de certains navigateurs.
- Quelque chose que vous devez savoir est que si un téléchargement peut être repris ou non est déterminé par le serveur
- Oui, je suis conscient de cela. Ma question est de savoir comment le reprendre lorsque le serveur le permet
- Vous devrez demander la plage correcte vous-même. Pas même le nouveau brillant
Http.Client
le fait automatiquement: blogs.msdn.com/b/webdev/archive/2012/11/23/... (Sauf si vous trouvez un fichier dédié bibliothèque de téléchargement.) - peut-être que j'ai mal compris quelque chose, mais il semble que le lien est sur la fourniture de reprendre la capacité des serveurs?
- Il décrit les deux côtés de ce protocole, qui, de chaque côté doivent être conscients. I. e. vous faites un
Range
demande, et obtenir uneContent-Range
réponse pour la plage que vous voulez, ou que vous obtenez un "normal" d'une réponse qui contient l'ensemble de la ressource. C'est juste un aperçu de toute façon, vous aurez à frapper jusqu'à la spécification HTTP, ou d'autres articles sur le sujet aussi.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mettre en œuvre le téléchargement à partir d'un serveur web dans
C#
à partir de zéro dans l'une des deux façons:En utilisant le haut niveau de l'Api System.Net comme
HttpWebRequest
,HttpWebResponse
,FtpWebRequest
, et d'autres classes.En utilisant les APIs bas-niveau dans le Système.Net.Les Sockets comme
TcpClient
,TcpListener
et Prise de classes.L'avantage de l'utilisation de la première approche, c'est que vous n'avez généralement pas besoin de s'inquiéter du faible niveau de la plomberie telles que la préparation et l'interprétation des en-têtes HTTP et de la manipulation du proxy, authentification, la mise en cache etc. Les classes de haut niveau faire pour vous, et donc je préfère cette approche.
À l'aide de la première méthode, un type de code à préparer une requête HTTP pour télécharger un fichier à partir d'une url ressemblera à quelque chose comme ceci:
À la fin du code ci-dessus, vous bénéficiez d'un réseau de flux d'objet que vous pouvez ensuite utiliser pour lire les octets du fichier distant comme si vous êtes la lecture de tout autre objet de flux de données. Maintenant, si l'url distante soutient la reprise partielle des téléchargements en vous permettant de lire de tout arbitraire position est déterminée par la "Accept-Ranges" en-tête HTTP, comme indiqué ci-dessus. Si cette valeur est définie sur une valeur autre que "octets", cette fonctionnalité n'est pas prise en charge.
En fait, ce code fait partie d'un plus grand opensource gestionnaire de téléchargement que je suis en train de mettre en œuvre en C#. Vous pouvez vous référer à cette application et voir si quelque chose peut être utile pour vous: http://scavenger.codeplex.com/
Il est open source .Net http file downloader avec reprise automatique/nouvelle tentative de support (si le serveur le supporte), on dirait qu'il est exactement ce dont vous avez besoin, vous pouvez essayer de l'utiliser:
https://github.com/Avira/.NetFileDownloader .
Il y a un Internet Download Manager de soutien pour vous de gérer cela.
Télécharger
IDMCOMAPI.zip
, Puis avec (Tlbimp) Type Library importer, importer le fichierIDManTypeInfo.tlb
à partir de l'extrait du zip.cmd:
Prendre note:
1.) Vous devez exécuter le
Command Prompt
en mode Administrateur.2.) Il y a quelques fichiers sans reprendre la capacité.