Bagaimana cara mengunduh file dari URL di C #?


352

Apa cara sederhana mengunduh file dari jalur URL?


13
Lihatlah System.Net.WebClient
seanb

Jawaban:


475
using (var client = new WebClient())
{
    client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg");
}

24
Solusi terbaik yang pernah ada tetapi saya ingin menambahkan 1 baris penting 'client.Credentials = new NetworkCredential ("UserName", "Password");'
Pengembang

3
Efek samping selamat datang: Metode ini juga mendukung file lokal sebagai parameter 1
oo_dev

Doc MSDN memang menyebutkan untuk menggunakan HttpClient sekarang sebagai gantinya: docs.microsoft.com/en-us/dotnet/api/…
StormsEngineering

Meskipun saya pikir WebClient sepertinya solusi yang jauh lebih mudah dan sederhana.
Mesin Badai

1
@ copa017: Atau yang berbahaya, jika, misalnya, URL disediakan oleh pengguna dan kode C # berjalan di server web.
Heinzi

177

Sertakan namespace ini

using System.Net;

Unduh Asinkron dan pasang ProgressBar untuk menunjukkan status unduhan di dalam UI Thread Sendiri

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

14
Pertanyaannya menanyakan cara paling sederhana. Membuat lebih rumit tidak membuatnya menjadi yang paling sederhana.
Enigmativity

75
Kebanyakan orang lebih suka bilah kemajuan saat mengunduh. Jadi saya hanya menulis cara paling sederhana untuk melakukan itu. Ini mungkin bukan jawabannya tetapi memenuhi persyaratan Stackoverflow. Itu untuk membantu seseorang.
Sayka

3
Ini hanya sesederhana jawaban yang lain jika Anda hanya meninggalkan bilah kemajuan. Jawaban ini juga mencakup namespace dan menggunakan async untuk I / O. Juga pertanyaannya tidak menanyakan cara paling sederhana, hanya cara sederhana. :)
Josh

Saya pikir memberikan 2 jawaban, satu sederhana dan satu dengan progress bar akan lebih baik
Jesse de gans

@Jessegans Sudah ada jawaban yang menunjukkan bagaimana cara mengunduh tanpa progressbar. Itulah sebabnya saya menulis jawaban yang membantu pengunduhan dan penerapan progressbar asinkron
Sayka

76

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

42
using System.Net;

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

33
Selamat datang di SO! Umumnya bukan ide yang baik untuk mengirim jawaban berkualitas rendah ke pertanyaan lama dan yang sudah memiliki jawaban yang sangat tervotifikasi.
ThiefMaster

28
Saya menemukan jawaban saya dari komentar seanb, tetapi sebenarnya saya lebih suka jawaban "berkualitas rendah" ini daripada yang lain. Lengkap (menggunakan pernyataan), ringkas dan mudah dimengerti. Menjadi pertanyaan lama tidak relevan, IMHO.
Josh

21
Tetapi ia berpikir jawabannya dengan Menggunakan jauh lebih baik, karena, saya pikir WebClient harus dibuang setelah digunakan. Menempatkannya di dalam menggunakan memastikan bahwa itu dibuang.
Ricardo Polo Jaramillo

5
Ini tidak ada hubungannya dengan membuang dalam contoh kode ini ... Pernyataan menggunakan di sini hanya menunjukkan namespace untuk digunakan, tidak ada yang menggunakan WebClient menjadi digunakan untuk membuang ...
cdie

17

Kelas lengkap untuk mengunduh file saat mencetak status ke konsol.

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

Pemakaian:

static void Main(string[] args)
{
    var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec);
    Console.WriteLine("Done  - success: " + success);
    Console.ReadLine();
}

1
Tolong bisakah Anda menjelaskan mengapa Anda menggunakan SemaphoreSlimdalam konteks ini?
mmushtaq

10

Coba gunakan ini:

private void downloadFile(string url)
{
     string file = System.IO.Path.GetFileName(url);
     WebClient cln = new WebClient();
     cln.DownloadFile(url, file);
}

dimana file akan disimpan?
IB

File akan disimpan di lokasi di mana file yang dapat dieksekusi. Jika Anda ingin path lengkap maka gunakan path lengkap bersama dengan file (yang merupakan nama file item yang akan diunduh)
Surendra Shrestha


8

Periksa koneksi jaringan yang digunakan GetIsNetworkAvailable()untuk menghindari membuat file kosong ketika tidak terhubung ke jaringan.

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

Saya sarankan tidak menggunakan GetIsNetworkAvailable()karena, dalam pengalaman saya, mengembalikan terlalu banyak false-positive.
Cherona

Kecuali Anda berada di jaringan komputer seperti LAN, GetIsNetworkAvailable() akan selalu kembali dengan benar. Dalam kasus seperti itu, Anda dapat menggunakan System.Net.WebClient().OpenRead(Uri)metode untuk melihat apakah itu kembali ketika diberi url default. Lihat WebClient.OpenRead ()
haZya

2

Kode di bawah ini berisi logika untuk mengunduh file dengan nama asli

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

1

Anda mungkin perlu mengetahui status dan memperbarui ProgressBar selama mengunduh file atau menggunakan kredensial sebelum mengajukan permintaan.

Ini dia, contoh yang mencakup opsi-opsi ini. Notasi Lambda dan interpolasi String telah digunakan:

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

1

Sesuai penelitian saya, saya menemukan itu WebClient.DownloadFileAsyncadalah cara terbaik untuk mengunduh file. Ini tersedia diSystem.Net namespace dan mendukung .net core juga.

Berikut ini contoh kode untuk mengunduh file.

using System;
using System.IO;
using System.Net;
using System.ComponentModel;

public class Program
{
    public static void Main()
    {
        new Program().Download("ftp://localhost/test.zip");
    }
    public void Download(string remoteUri)
    {
        string FilePath = Directory.GetCurrentDirectory() + "/tepdownload/" + Path.GetFileName(remoteUri); // path where download file to be saved, with filename, here I have taken file name from supplied remote url
        using (WebClient client = new WebClient())
        {
            try
            {
                if (!Directory.Exists("tepdownload"))
                {
                    Directory.CreateDirectory("tepdownload");
                }
                Uri uri = new Uri(remoteUri);
                //password username of your file server eg. ftp username and password
                client.Credentials = new NetworkCredential("username", "password");
                //delegate method, which will be called after file download has been complete.
                client.DownloadFileCompleted += new AsyncCompletedEventHandler(Extract);
                //delegate method for progress notification handler.
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgessChanged);
                // uri is the remote url where filed needs to be downloaded, and FilePath is the location where file to be saved
                client.DownloadFileAsync(uri, FilePath);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
    public void Extract(object sender, AsyncCompletedEventArgs e)
    {
        Console.WriteLine("File has been downloaded.");
    }
    public void ProgessChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine($"Download status: {e.ProgressPercentage}%.");
    }
}

Dengan kode di atas file akan diunduh di dalam tepdownloadfolder direktori proyek. Silakan baca komentar dalam kode untuk memahami apa yang dilakukan kode di atas.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.