Как загрузить файл с URL-адреса в C #?

Что такое простой способ загрузки файла из URL-адреса?

using (var client = new WebClient()) { client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg"); } 

Включить это пространство имен

 using System.Net; 

Загрузите Asynchronously и поставьте ProgressBar, чтобы показать статус загрузки в самой теме пользовательского интерфейса.

 private void BtnDownload_Click(object sender, RoutedEventArgs e) { using (WebClient wc = new WebClient()) { wc.DownloadProgressChanged += wc_DownloadProgressChanged; wc.DownloadFileAsync ( // Param1 = Link of file new System.Uri("http://sofru.miximages.com/c%23/front_view.jpg"), // Param2 = Path to save "D:\\Images\\front_view.jpg" ); } } // Event to track the progress void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } 

Использовать System.Net.WebClient.DownloadFile :

 string remoteUri = "http://www.contoso.com/library/homepage/images/"; string fileName = "ms-banner.gif", myStringWebResource = null; // Create a new WebClient instance. using (WebClient myWebClient = new WebClient()) { myStringWebResource = remoteUri + fileName; // Download the Web resource and save it into the current filesystem folder. myWebClient.DownloadFile(myStringWebResource, fileName); } 
 using System.Net; WebClient webClient = new WebClient(); webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt"); 

Полный class для загрузки файла при печати статуса на консоль.

 using System; using System.ComponentModel; using System.IO; using System.Net; using System.Threading; class FileDownloader { private readonly string _url; private readonly string _fullPathWhereToSave; private bool _result = false; private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0); public FileDownloader(string url, string fullPathWhereToSave) { if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url"); if (string.IsNullOrEmpty(fullPathWhereToSave)) throw new ArgumentNullException("fullPathWhereToSave"); this._url = url; this._fullPathWhereToSave = fullPathWhereToSave; } public bool StartDownload(int timeout) { try { System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWhereToSave)); if (File.Exists(_fullPathWhereToSave)) { File.Delete(_fullPathWhereToSave); } using (WebClient client = new WebClient()) { var ur = new Uri(_url); // client.Credentials = new NetworkCredential("username", "password"); client.DownloadProgressChanged += WebClientDownloadProgressChanged; client.DownloadFileCompleted += WebClientDownloadCompleted; Console.WriteLine(@"Downloading file:"); client.DownloadFileAsync(ur, _fullPathWhereToSave); _semaphore.Wait(timeout); return _result && File.Exists(_fullPathWhereToSave); } } catch (Exception e) { Console.WriteLine("Was not able to download file!"); Console.Write(e); return false; } finally { this._semaphore.Dispose(); } } private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Console.Write("\r --> {0}%.", e.ProgressPercentage); } private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args) { _result = !args.Cancelled; if (!_result) { Console.Write(args.Error.ToString()); } Console.WriteLine(Environment.NewLine + "Download finished!"); _semaphore.Release(); } public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec) { return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec); } } - using System; using System.ComponentModel; using System.IO; using System.Net; using System.Threading; class FileDownloader { private readonly string _url; private readonly string _fullPathWhereToSave; private bool _result = false; private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0); public FileDownloader(string url, string fullPathWhereToSave) { if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url"); if (string.IsNullOrEmpty(fullPathWhereToSave)) throw new ArgumentNullException("fullPathWhereToSave"); this._url = url; this._fullPathWhereToSave = fullPathWhereToSave; } public bool StartDownload(int timeout) { try { System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWhereToSave)); if (File.Exists(_fullPathWhereToSave)) { File.Delete(_fullPathWhereToSave); } using (WebClient client = new WebClient()) { var ur = new Uri(_url); // client.Credentials = new NetworkCredential("username", "password"); client.DownloadProgressChanged += WebClientDownloadProgressChanged; client.DownloadFileCompleted += WebClientDownloadCompleted; Console.WriteLine(@"Downloading file:"); client.DownloadFileAsync(ur, _fullPathWhereToSave); _semaphore.Wait(timeout); return _result && File.Exists(_fullPathWhereToSave); } } catch (Exception e) { Console.WriteLine("Was not able to download file!"); Console.Write(e); return false; } finally { this._semaphore.Dispose(); } } private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Console.Write("\r --> {0}%.", e.ProgressPercentage); } private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args) { _result = !args.Cancelled; if (!_result) { Console.Write(args.Error.ToString()); } Console.WriteLine(Environment.NewLine + "Download finished!"); _semaphore.Release(); } public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec) { return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec); } } 

Применение:

 static void Main(string[] args) { var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec); Console.WriteLine("Done - success: " + success); Console.ReadLine(); } 

Также вы можете использовать метод DownloadFileAsync в classе WebClient. Он загружает в локальный файл ресурс с указанным URI. Также этот метод не блокирует вызывающий stream.

Образец:

  webClient.DownloadFileAsync(new Uri("http://www.example.com/file/test.jpg"), "test.jpg"); 

Чтобы получить больше информации:

http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/

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

 if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { using (System.Net.WebClient client = new System.Net.WebClient()) { client.DownloadFileAsync(new Uri("http://www.examplesite.com/test.txt"), "D:\\test.txt"); } } 

Попробуйте использовать это:

 private void downloadFile(string url) { string file = System.IO.Path.GetFileName(url); WebClient cln = new WebClient(); cln.DownloadFile(url, file); } 

Ниже код содержит логику для файла загрузки с оригинальным именем

 private string DownloadFile(string url) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); string filename = ""; string destinationpath = Environment; if (!Directory.Exists(destinationpath)) { Directory.CreateDirectory(destinationpath); } using (HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result) { string path = response.Headers["Content-Disposition"]; if (string.IsNullOrWhiteSpace(path)) { var uri = new Uri(url); filename = Path.GetFileName(uri.LocalPath); } else { ContentDisposition contentDisposition = new ContentDisposition(path); filename = contentDisposition.FileName; } var responseStream = response.GetResponseStream(); using (var fileStream = File.Create(System.IO.Path.Combine(destinationpath, filename))) { responseStream.CopyTo(fileStream); } } return Path.Combine(destinationpath, filename); } 

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

Вот он, пример, который охватывает эти параметры. Лембда-нотация и струнная интерполяция были использованы:

 using System.Net; // ... using (WebClient client = new WebClient()) { Uri ur = new Uri("http://sofru.miximages.com/c%23/img.jpg"); //client.Credentials = new NetworkCredential("username", "password"); String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("Username" + ":" + "MyNewPassword")); client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}"; client.DownloadProgressChanged += (o, e) => { Console.WriteLine($"Download status: {e.ProgressPercentage}%."); // updating the UI Dispatcher.Invoke(() => { progressBar.Value = e.ProgressPercentage; }); }; client.DownloadDataCompleted += (o, e) => { Console.WriteLine("Download finished!"); }; client.DownloadFileAsync(ur, @"C:\path\newImage.jpg"); } 

Вместо того, чтобы загружать этот файл в локальный файл, вы можете преобразовать его в объект streamа байтов и сохранить его как varbinary (MAX) BLOB в SQL Server.

Учитывая, что ваш стол выглядит так:

 CREATE TABLE [dbo].[Documents]( [DocumentId] [int] IDENTITY(1,1) NOT NULL, [DocumentTypeId] [int] NOT NULL, [UploadedByMemberId] [int] NOT NULL, [DocumentTitle] [nvarchar](200) NOT NULL, [DocumentDescription] [nvarchar](2000) NULL, [FileName] [nvarchar](200) NOT NULL, [DateUploaded] [datetime] NOT NULL, [ApprovedForUsers] [bit] NOT NULL, [ApprovedByMemberId] [int] NOT NULL, [ApprovedDate] [datetime] NULL, [DocBLOB] [varbinary](max) NOT NULL, CONSTRAINT [PK_Documents] PRIMARY KEY CLUSTERED ( [DocumentId] ASC ) SqlParameter Title = new SqlParameter("@Title", SqlDbType.VarChar); SqlParameter FileName = new SqlParameter("@FileName", SqlDbType.VarChar); SqlParameter DateFileUploaded = new SqlParameter("@DateUploaded", SqlDbType.VarChar); SqlParameter DocBLOB = new SqlParameter("@DocBLOB", SqlDbType.VarBinary); command.Parameters.Add(Title); command.Parameters.Add(FileName); command.Parameters.Add(DateFileUploaded); command.Parameters.Add(DocBLOB); myStringWebResource = remoteUri + dataReader["FileName"].ToString(); imgdownload = myWebClient.DownloadData(myStringWebResource); querySQL = @"INSERT INTO Documents(DocumentTypeId, UploadedByMemberId, DocumentTitle, DocumentDescription, FileName, DateUploaded, ApprovedForUsers, ApprovedByMemberId, ApprovedDate, DocBLOB) VALUES(1, 0, @Title, '', @FileName, @DateUploaded, 1, 0, GETDATE(), @DocBLOB);"; Title.Value = dataReader["Title"].ToString().Replace("'", "''").Replace("\"", ""); FileName.Value = dataReader["FileName"].ToString().Replace("'", "''").Replace("\"", ""); DateFileUploaded.Value = dataReader["DateUploaded"].ToString(); DocBLOB.Value = imgdownload; command.CommandText = querySQL; command.ExecuteNonQuery(); 
Давайте будем гением компьютера.