Как загрузить файл из Интернета в приложении WinForm - PullRequest
3 голосов
/ 15 октября 2010

Я пишу служебную программу на C #, для которой мне нужна возможность загружать и сохранять файл с URL-адреса.

У меня есть код для получения URL-адреса из вызова веб-службы, однакоУ меня возникли проблемы с поиском простого примера того, как начать загрузку и сохранить данные в файл на диске.

У кого-нибудь есть хороший пример этого или можно привести пример?

Спасибо!

РЕДАКТИРОВАТЬ - я должен отметить, что эти файлы будут иметь размер от 3 до 4 ГБ.Поэтому, если у файлов такого размера есть особые соображения, я буду признателен за любые советы.

Ответы [ 3 ]

4 голосов
/ 15 октября 2010

WebClient.DownloadData, спецификация содержит небольшой образец.Возможно, более эффективно использовать WebRequest.GetResponseStream и сохранять порцию данных по порциям, но вам придется правильно подготовить WebRequest самостоятельно.

Обновлено

Если вам нужно загрузить файлы размером 3-4 ГБ, вы должны сделать гораздо больше, чем предлагает .Net Framework.WebClient не подлежит сомнению, поскольку он возвращает содержимое в виде одного монолитного байта [].Даже если предположить, что VAS (виртуальное адресное пространство) имеет 4 ГБ для записи этих загрузок, .Net не может выделить что-нибудь больше 2 ГБ (также на x64).Таким образом, вы должны использовать потоки, как в GetResponseStream ().

Во-вторых, вы должны использовать единицы измерения диапазона HTTP в своем запросе согласно HTTP / 1.1 разделу 3.12 .Ваш запрос должен содержать Content-Range заголовков, чтобы можно было возобновить прерванную загрузку.И, конечно же, ваш целевой сервер должен будет принять и распознать эти заголовки и, возможно, ответить prpoer accept-ranges, что делают несколько серверов.

Ваша тарелка заполнена, загрузка 4Gb совсем не тривиальна.

1 голос
/ 15 октября 2010

Поскольку у вас есть гигантские файлы, подготовьтесь к некоторому восстановлению соединения.

Какой бы метод вы ни нашли, чтобы получить что-то из http (WebClient, TcpStream, ...), вы, вероятно, должны писать код с самого начала с самого начала. Это должно быть сосредоточено здесь.

Для этого необходимо проверить, поддерживает ли Stream, возвращенный из GetResponseStream(), Seek().

1 голос
/ 15 октября 2010

Просто используйте WebClient.DownloadFile (или WebClient.DownloadFileAsync, если вы не хотите останавливать пользовательский интерфейс во время загрузки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...