Bagaimana cara mengunduh file dari URL di C #?

352

Apa cara sederhana mengunduh file dari jalur URL?

vbroto
sumber
13
Lihatlah System.Net.WebClient
seanb

Jawaban:

475
using (var client = new WebClient())
{
    client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg");
}
Raj Kumar
sumber
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;
}
Sayka
sumber
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);        
}
vbroto
sumber
42
using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");
petrzjunior
sumber
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();
}
Jonas_Hess
sumber
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);
}
Surendra Shrestha
sumber
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
9

Anda juga dapat menggunakan metode DownloadFileAsync di kelas WebClient. Ini mengunduh ke file lokal sumber daya dengan URI yang ditentukan. Juga metode ini tidak memblokir utas panggilan.

Sampel:

    webClient.DownloadFileAsync(new Uri("http://www.example.com/file/test.jpg"), "test.jpg");

Untuk informasi lebih lanjut:

http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/

Turgay
sumber
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");
    }                  
}
haZya
sumber
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);
    }
Darshit Gandhi
sumber
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");
}
Kreshnik
sumber
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.

Kiran Shahi
sumber