Как загрузить веб-файл с C # и показать ход загрузки синхронно и асинхронно

Существует несколько типов файлов, которые вы можете загрузить из Интернета: документы, изображения, видео, расширения и т. Д. Независимо от вашей причины (функция обновления в вашем приложении, получение дополнительных ресурсов и т. Д.), Знать, как загрузить файл с помощью C #, необходимость в наши дни.

Для достижения нашей цели мы будем зависеть от класса WebClient .NET. WebClient — это абстракция более высокого уровня, созданная поверх HttpWebRequest для упрощения наиболее распространенных задач.

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

using System.Net;

Syncronously

Самый простой способ загрузить файл синхронно (заморозить пользовательский интерфейс), благодаря классу WebClient будет состоять из 5 строк:

// A web URL with a file response
string myWebUrlFile = "https://www.google.com/images/icons/ui/doodle_plus/logo.png";
// Local path where the file will be saved
string myLocalFilePath = "C:/users/desktop/logo.png";
using (var client = new WebClient())
{
client.DownloadFile(myWebUrlFile, myLocalFilePath);
}

В предыдущем примере вы должны понимать, как работает метод DownloadFile. Однако от вас зависит, как собираетесь реализовывать и совершенствовать метод.

Обратите внимание, что в нашем примере мы используем оператор using, поскольку WebClient реализует IDisposable в качестве хорошей практики.

Следующий фрагмент загрузит файл на рабочем столе с его оригинальным именем (который получен из URL с getFilename метод):

///
/// Download a file in the desktop path and save it with the original filename.
///
private void downloadFile()
{
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
// Change the url by the value you want (a textbox or something else)
string url = "https://www.google.com/images/icons/ui/doodle_plus/logo.png";
// Get filename from URL
string filename = getFilename(url);
using (var client = new WebClient())
{
client.DownloadFile(url, desktopPath + "/" + filename);
}
MessageBox.Show("Download ready");
}
///
/// Get the filename from a web url :
///
/// www.google.com/image.png -> returns : image.png
///
///
///
///
private string getFilename(string hreflink)
{
Uri uri = new Uri(hreflink);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
return filename;
}

Чтобы проверить фрагмент, просто выполните downloadFile метод с некоторым действием, т. е. нажатием кнопки.

Асинхронный

Обычно, нормально и очевидно мы не хотим заморозить пользовательский интерфейс и вы должен всегда предпочитать асинхронный способ вместо этого (если у вас нет исключения в вашем случае).

В этом случае мы будем использовать метод WebClient.DownloadFileAsync.

///
/// Download a file asynchronously in the desktop path, show the download progress and save it with the original filename.
///
private void downloadFile()
{
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
// This will download a large image from the web, you can change the value
// i.e a textbox : textBox1.Text
string url ="http://feelgrafix.com/data/wallpaper-hd/Wallpaper-HD-11.jpg"
string filename = getFilename(url);
using (WebClient wc = new WebClient())
{
wc.DownloadProgressChanged += wc_DownloadProgressChanged;
wc.DownloadFileCompleted += wc_DownloadFileCompleted;
wc.DownloadFileAsync(new Uri(url), desktopPath + "/" + filename);
}
}
///
///  Show the progress of the download in a progressbar
///
///
///
private void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// In case you don't have a progressBar Log the value instead
// Console.WriteLine(e.ProgressPercentage);
progressBar1.Value = e.ProgressPercentage;
}
private void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
progressBar1.Value = 0;
if (e.Cancelled)
{
MessageBox.Show("The download has been cancelled");
return;
}
if (e.Error != null) // We have an error! Retry a few times, then abort.
{
MessageBox.Show("An error ocurred while trying to download file");
return;
}
MessageBox.Show("File succesfully downloaded");
}

Поскольку метод является асинхронным, нам нужно правильно создать обратные вызовы в методе downloadFile.

Чтобы проверить фрагмент, добавьте в форму индикатор выполнения и выполните команду downloadFile метод с некоторым действием, т. е. нажатием кнопки.

Кроме того, вы можете показать общее количество ожидающих байтов из размера файла (в байтах) файла в событии DownloadProgressChanged:

private void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage + "% | " + e.BytesReceived + " bytes out of " + e.TotalBytesToReceive + " bytes retrieven.");
// 50% | 5000 bytes out of 10000 bytes retrieven.
}

Отмена асинхронной загрузки

Возможность отменить загрузку является важной основой жизненного цикла загрузки файла.

Чтобы отменить загрузку WebClient, вам просто нужно использовать метод CancelAsync созданного веб-клиента.

WebClient client = new WebClient();
private void downloadFile()
{
string url = "https://www.google.com/images/icons/ui/doodle_plus/logo.png";
string myLocalFilePath = "C:/users/desktop/logo.png";
using (client)
{
client.DownloadFileAsync(new Uri(url), myLocalFilePath);
}
}
private void cancelDownload()
{
client.CancelAsync();
}

Замечания: так как проще добавлять прослушиватели в классе, а не в методе downloadFile, мы предоставляем клиенту доступ к глобальной области видимости из методов cancelDownload и downloadFile. Чтобы проверить фрагмент, просто добавьте методы в качестве действия пары кнопок.

Помните, что для проверки отмены загрузки файла добавьте DownloadFileCompleted перезвонить и проверить event.Cancelled значение, как показано в асинхронном примере.

Заключение

Независимо от протокола (http или https) файл будет загружен без каких-либо проблем (если есть Интернет), если он разрешен и доступен с сервера.

Вы можете использовать небольшую хитрость, чтобы предотвратить создание пустых файлов в случае, если нет интернета, доступного с помощью GetIsNetworkAvailable из NetworkInterface:

if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
MessageBox.Show("Internet available, proceed with the download");
}

Повеселись

Ссылка на основную публикацию
Adblock
detector