Quel est le moyen le plus simple de télécharger un fichier à partir d'un chemin URL ?
La meilleure solution qui soit, mais je voudrais ajouter une ligne importante : "client.Credentials = new NetworkCredential("UserName", "Password") ;".
Quel est le moyen le plus simple de télécharger un fichier à partir d'un chemin URL ?
La meilleure solution qui soit, mais je voudrais ajouter une ligne importante : "client.Credentials = new NetworkCredential("UserName", "Password") ;".
Un effet secondaire bienvenu : Cette méthode supporte également les fichiers locaux comme 1er paramètre
Inclure cet espace de nom
using System.Net;
Télécharger De manière asynchrone et mettre un Barre d'avancement pour montrer l'état du téléchargement dans le fil de l'interface utilisateur lui-même.
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://www.sayka.com/downloads/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;
}
La question demande le moyen le plus simple. La rendre plus compliquée n'en fait pas la plus simple.
La plupart des gens préfèrent une barre de progression pendant le téléchargement. J'ai donc écrit la façon la plus simple de le faire. Ce n'est peut-être pas la réponse mais cela répond aux exigences de Stackoverflow. C'est d'aider quelqu'un.
C'est tout aussi simple que l'autre réponse si vous laissez de côté la barre de progression. Cette réponse inclut également l'espace de noms et utilise async pour les entrées/sorties. De plus, la question ne demande pas la méthode la plus simple, mais une méthode simple :)
Utilisez 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);
}
Bienvenue à SO ! En général, ce n'est pas une bonne idée de poster une réponse de mauvaise qualité à une question existante et ancienne qui a déjà reçu des réponses très positives.
J'ai trouvé ma réponse dans le commentaire de seanb, mais vraiment je préfère cette réponse de "basse qualité" aux autres. Elle est complète (utilisation de la déclaration), concise et facile à comprendre. Le fait qu'il s'agisse d'une vieille question n'est pas pertinent, IMHO.
Mais je pense que la réponse avec Using est bien meilleure, car je pense que le WebClient doit être éliminé après avoir été utilisé. En le plaçant à l'intérieur de using, on s'assure qu'il est éliminé.
Classe complète pour télécharger un fichier tout en imprimant le statut à la console.
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);
}
}
Utilisation :
static void Main(string[] args)
{
var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec);
Console.WriteLine("Done - success: " + success);
Console.ReadLine();
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
18 votes
Jetez un coup d'œil à System.Net.WebClient.