Подтвердить что ты не робот

Загрузить большой файл из HTTP с поддержкой возобновления/повтора в .NET?

Как реализовать загрузку большого файла (~ 500 МБ) из HTTP в моем приложении? Я хочу поддерживать автоматическое возобновление/повтор, так что, когда соединение отключено, мое приложение может попытаться восстановить соединение, чтобы получить файл, и избежать повторной загрузки загруженной части, если это возможно (я знаю, это зависит и от сервера).

Это похоже на поведение менеджеров загрузки и некоторых браузеров.

4b9b3361

Ответ 1

Вы можете осуществлять загрузку с веб-сервера в C# с нуля одним из двух способов:

  • Использование высокоуровневых API в System.Net, таких как HttpWebRequest, HttpWebResponse, FtpWebRequest и другие классы.

  • Использование низкоуровневых API в System.Net.Sockets, таких как TcpClient, TcpListener и классы Socket.

Преимущество использования первого подхода состоит в том, что вам, как правило, не нужно беспокоиться о низкоуровневой сантехнике, такой как подготовка и интерпретация заголовков HTTP и обработка прокси, аутентификация, кэширование и т.д. Классы высокого уровня делают это для вы и, следовательно, предпочитаете этот подход.

Используя первый метод, типичный код для подготовки HTTP-запроса для загрузки файла с URL-адреса будет выглядеть примерно так:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
if (UseProxy)
{
    request.Proxy = new WebProxy(ProxyServer + ":" + ProxyPort.ToString());
    if (ProxyUsername.Length > 0)
        request.Proxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword);
}
//HttpWebRequest hrequest = (HttpWebRequest)request;
//hrequest.AddRange(BytesRead); ::TODO: Work on this
if (BytesRead > 0) request.AddRange(BytesRead);

WebResponse response = request.GetResponse();
//result.MimeType = res.ContentType;
//result.LastModified = response.LastModified;
if (!resuming)//(Size == 0)
{
    //resuming = false;
    Size = (int)response.ContentLength;
    SizeInKB = (int)Size / 1024;
}
acceptRanges = String.Compare(response.Headers["Accept-Ranges"], "bytes", true) == 0;

//create network stream
ns = response.GetResponseStream();        

В конце приведенного выше кода вы получаете объект сетевого потока, который затем можно использовать для чтения байтов удаленного файла, как если бы вы читали какой-либо другой объект потока. Теперь, поддерживает ли удаленный url возобновление частичных загрузок, позволяя вам читать любую произвольную позицию, определяется заголовком HTTP "Accept-Ranges" , как показано выше. Если для этого значения установлено значение, отличное от "байтов", эта функция не будет поддерживаться.

Фактически, этот код является частью более крупного диспетчера загрузки с открытым исходным кодом, который я пытаюсь реализовать на С#. Вы можете обратиться к этому приложению и посмотреть, поможет ли вам что-нибудь: http://scavenger.codeplex.com/

Ответ 2

Существует файл с открытым исходным кодом .Net http file downloader с автоматической поддержкой возобновления/повтора (если сервер поддерживает его), он выглядит именно так, как вам нужно, может попытаться его использовать:

https://github.com/Avira/.NetFileDownloader.

Ответ 3

Там Internet Download Manager поможет вам справиться с этим. Загрузите IDMCOMAPI.zip, затем с помощью Tlbimp) Тип библиотеки Импортер импортирует файл IDManTypeInfo.tlb из извлеченного почтового индекса.

CMD

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\TlbExp.exe (FilePathGoesHere)\IDManTypeInfo.tlb

Обратите внимание:

1.) Вы должны запустить Command Prompt в режиме администратора.

2.) Есть несколько файлов без возможности возобновления.