How to download a file from a URL in C#?

前端 未结 11 1096
清歌不尽
清歌不尽 2020-11-22 15:13

What is a simple way of downloading a file from a URL path?

相关标签:
11条回答
  • 2020-11-22 15:37

    Complete class to download a file while printing status to 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);
        }
    }
    

    Usage:

    static void Main(string[] args)
    {
        var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec);
        Console.WriteLine("Done  - success: " + success);
        Console.ReadLine();
    }
    
    0 讨论(0)
  • 2020-11-22 15:38

    Include this namespace

    using System.Net;
    

    Download Asynchronously and put a ProgressBar to show the status of the download within the UI Thread Itself

    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;
    }
    
    0 讨论(0)
  • 2020-11-22 15:38

    Check for a network connection using GetIsNetworkAvailable() to avoid creating empty files when not connected to a network.

    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");
        }                  
    }
    
    0 讨论(0)
  • 2020-11-22 15:38

    Below code contain logic for download file with original name

    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);
        }
    
    0 讨论(0)
  • 2020-11-22 15:44

    You may need to know the status and update a ProgressBar during the file download or use credentials before making the request.

    Here it is, an example that covers these options. Lambda notation and String interpolation has been used:

    using System.Net;
    // ...
    
    using (WebClient client = new WebClient()) {
        Uri ur = new Uri("http://remotehost.do/images/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");
    }
    
    0 讨论(0)
提交回复
热议问题