Существует несколько типов файлов, которые вы можете загрузить из Интернета: документы, изображения, видео, расширения и т. Д. Независимо от вашей причины (функция обновления в вашем приложении, получение дополнительных ресурсов и т. Д.), Знать, как загрузить файл с помощью 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");
}
Повеселись