464 votes

Comment télécharger un fichier à partir d'une URL en C# ?

Quel est le moyen le plus simple de télécharger un fichier à partir d'un chemin URL ?

18 votes

Jetez un coup d'œil à System.Net.WebClient.

601voto

Raj Kumar Points 1267
using (WebClient Client = new WebClient ())
{
    Client.DownloadFile("http://www.abc.com/file/song/a.mpeg", "a.mpeg");
}

38 votes

La meilleure solution qui soit, mais je voudrais ajouter une ligne importante : "client.Credentials = new NetworkCredential("UserName", "Password") ;".

6 votes

Un effet secondaire bienvenu : Cette méthode supporte également les fichiers locaux comme 1er paramètre

0 votes

Bien que je pense que WebClient semble être une solution beaucoup plus directe et simple.

237voto

Sayka Points 435

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;
}

15 votes

La question demande le moyen le plus simple. La rendre plus compliquée n'en fait pas la plus simple.

105 votes

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.

4 votes

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 :)

94voto

vbroto Points 723

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

4 votes

WebClient est obsolète, voir github.com/dotnet/runtime/issues/33125

49voto

petrzjunior Points 144
using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");

36 votes

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.

32 votes

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.

22 votes

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é.

23voto

Jonas_Hess Points 1363

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();
}

1 votes

Pouvez-vous expliquer pourquoi vous utilisez SemaphoreSlim dans ce contexte ?

Prograide.com

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.

Powered by:

X