Como baixar um arquivo de um site em C #

É possível baixar um arquivo de um site no formulário do Windows e colocá-lo em um determinado diretório?

Com a class WebClient :

using System.Net; //... WebClient Client = new WebClient (); Client.DownloadFile("http://sofpt.miximages.com/c%23/stackoverflow-logo-250.png", @"C:\folder\stackoverflowlogo.png"); 

Use WebClient.DownloadFile :

 using (WebClient client = new WebClient()) { client.DownloadFile("http://csharpindepth.com/Reviews.aspx", @"c:\Users\Jon\Test\foo.txt"); } 

Você pode precisar saber o status durante o download do arquivo ou usar credenciais antes de fazer a solicitação.

Aqui está um exemplo que abrange essas opções:

 Uri ur = new Uri("http://sofpt.miximages.com/c%23/img.jpg"); using (WebClient client = new WebClient()) { //client.Credentials = new NetworkCredential("username", "password"); String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("Username" + ":" + "MyNewPassword")); client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}"; client.DownloadProgressChanged += WebClientDownloadProgressChanged; client.DownloadDataCompleted += WebClientDownloadCompleted; client.DownloadFileAsync(ur, @"C:\path\newImage.jpg"); } 

E as funções do callback implementadas da seguinte forma:

 void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Console.WriteLine("Download status: {0}%.", e.ProgressPercentage); // updating the UI Dispatcher.Invoke(() => { progressBar.Value = e.ProgressPercentage; }); } void WebClientDownloadCompleted(object sender, DownloadDataCompletedEventArgs e) { Console.WriteLine("Download finished!"); } 

Notação lambda: outra opção possível para lidar com os events

 client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(delegate(object sender, DownloadProgressChangedEventArgs e) { Console.WriteLine("Download status: {0}%.", e.ProgressPercentage); // updating the UI Dispatcher.Invoke(() => { progressBar.Value = e.ProgressPercentage; }); }); client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(delegate(object sender, DownloadDataCompletedEventArgs e){ Console.WriteLine("Download finished!"); }); 

Nós podemos fazer melhor

 client.DownloadProgressChanged += (object sender, DownloadProgressChangedEventArgs e) => { Console.WriteLine("Download status: {0}%.", e.ProgressPercentage); // updating the UI Dispatcher.Invoke(() => { progressBar.Value = e.ProgressPercentage; }); }; client.DownloadDataCompleted += (object sender, DownloadDataCompletedEventArgs e) => { Console.WriteLine("Download finished!"); }; 

Ou

 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!"); }; 

Claro, você acabou de usar um HttpWebRequest .

Depois de configurar o HttpWebRequest , você pode salvar o stream de resposta em um arquivo StreamWriter ( BinaryWriter ou TextWriter dependendo do tipo MIME.) E você tem um arquivo no disco rígido.

EDIT: Esqueceu sobre WebClient . Isso funciona bem, a menos que você só precise usar GET para recuperar seu arquivo. Se o site exigir que você POST informações nele, será necessário usar um HttpWebRequest , por isso deixarei minha resposta pronta.

Você pode usar este código para baixar o arquivo de um site para o ambiente de trabalho:

 using System.Net; WebClient Client = new WebClient (); client.DownloadFileAsync(new Uri("http://www.Address.com/File.zip"), Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "File.zip"); 

Tente este exemplo:

 public void TheDownload(string path) { System.IO.FileInfo toDownload = new System.IO.FileInfo(HttpContext.Current.Server.MapPath(path)); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + toDownload.Name); HttpContext.Current.Response.AddHeader("Content-Length", toDownload.Length.ToString()); HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.WriteFile(patch); HttpContext.Current.Response.End(); } 

A implementação é feita da seguinte forma:

 TheDownload("@"c:\Temporal\Test.txt""); 

Fonte: http://www.systemdeveloper.info/2014/03/force-downloading-file-from-c.html

Além disso, você pode usar o método DownloadFileAsync na class WebClient . Transfere para um arquivo local o recurso com o URI especificado. Além disso, esse método não bloqueia o thread de chamada.

Amostra:

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

Para maiores informações:

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