net - descargar archivo xml c#
Cómo descargar un archivo desde un sitio web en C# (7)
Claro, solo usas una HttpWebRequest
.
Una vez que haya configurado HttpWebRequest
, puede guardar la secuencia de respuesta en un archivo StreamWriter
(ya sea BinaryWriter
, o un TextWriter
según el tipo de TextWriter
) y tenga un archivo en su disco duro.
EDITAR: se olvidó de WebClient
. Eso funciona bien a menos que siempre que solo necesite usar GET
para recuperar su archivo. Si el sitio requiere que le POST
información, tendrá que usar una HttpWebRequest
, así que dejo mi respuesta.
¿Es posible descargar un archivo de un sitio web en el formulario de aplicación de Windows y colocarlo en un directorio determinado?
Con la clase WebClient :
using System.Net;
//...
WebClient Client = new WebClient ();
Client.DownloadFile("http://i..com/Content/Img/-logo-250.png", @"C:/folder/logo.png");
Es posible que necesite conocer el estado durante la descarga del archivo o usar credenciales antes de realizar la solicitud.
Aquí hay un ejemplo que cubre estas opciones:
Uri ur = new Uri("http://remotehost.do/images/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");
}
Y las funciones de devolución de llamada implementadas de la siguiente manera:
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!");
}
Notación de Lambda: otra opción posible para manejar los eventos
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!");
});
Podemos hacerlo mejor
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!");
};
O
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!");
};
Prueba este ejemplo:
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();
}
La implementación se realiza de la siguiente manera:
TheDownload("@"c:/Temporal/Test.txt"");
Fuente: http://www.systemdeveloper.info/2014/03/force-downloading-file-from-c.html
Puede usar este código para descargar archivos de un sitio web a un escritorio:
using System.Net;
WebClient Client = new WebClient ();
client.DownloadFileAsync(new Uri("http://www.Address.com/File.zip"), Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "File.zip");
También puede usar el método DownloadFileAsync
en la clase WebClient
. Descarga a un archivo local el recurso con el URI
especificado. Además, este método no bloquea el hilo de llamada.
Muestra:
webClient.DownloadFileAsync(new Uri("http://www.example.com/file/test.jpg"), "test.jpg");
Para más información:
http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/
Use WebClient.DownloadFile
:
using (WebClient client = new WebClient())
{
client.DownloadFile("http://csharpindepth.com/Reviews.aspx",
@"c:/Users/Jon/Test/foo.txt");
}