C # में URL से फाइल कैसे डाउनलोड करें?


352

URL पथ से फ़ाइल डाउनलोड करने का एक सरल तरीका क्या है?


13
System.Net.WebClient
seanb

जवाबों:


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

24
अब तक का सबसे अच्छा समाधान, लेकिन मैं 1 महत्वपूर्ण पंक्ति 'ग्राहक जोड़ना चाहूंगा। क्रेडिट = नया नेटवर्क नेटवर्क ("उपयोगकर्ता नाम", "पासवर्ड");)
डेवलपर

3
एक स्वागत योग्य साइड इफेक्ट: यह विधि स्थानीय फाइल को 1 पैरामीटर
oo_dev

MSDN डॉक ने अब इसके बजाय HttpClient का उपयोग करने का उल्लेख किया: docs.microsoft.com/en-us/dotnet/api/…
StormsEngineering

हालांकि मुझे लगता है कि WebClient एक अधिक सरल और सरल समाधान की तरह लगता है।
StormsEngineering

1
@ copa017: या एक खतरनाक, यदि, उदाहरण के लिए, URL उपयोगकर्ता द्वारा आपूर्ति की गई है और C # कोड एक वेब सर्वर पर चलता है।
हेनजी

177

इस नाम स्थान को शामिल करें

using System.Net;

एसिंक्रोनस रूप से डाउनलोड करें और यूआई थ्रेड स्वयं के भीतर डाउनलोड की स्थिति दिखाने के लिए एक प्रोग्रेसबार डालें

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
सवाल सबसे सरल तरीके से पूछता है। अधिक जटिल बनाना सबसे सरल नहीं है।
Enigmativity

75
ज्यादातर लोग डाउनलोड करते समय एक प्रगति बार पसंद करेंगे। इसलिए मैंने ऐसा करने का सबसे सरल तरीका लिखा। यह उत्तर नहीं हो सकता है लेकिन यह स्टैकओवरफ्लो की आवश्यकता को पूरा करता है। यानी किसी की मदद करना।
सायका

3
यह सिर्फ दूसरे उत्तर के रूप में सरल है यदि आप प्रगति पट्टी को छोड़ देते हैं। इस जवाब में नाम स्थान भी शामिल है और I / O के लिए async का उपयोग करता है। इसके अलावा सवाल सबसे आसान तरीका नहीं है, बस एक आसान तरीका है। :)
जोश

मुझे लगता है कि 2 उत्तर एक सरल और एक प्रगति पट्टी के साथ देना बेहतर होगा
जेसी डी

@Jessedegans पहले से ही एक उत्तर है जो दिखाता है कि बिना प्रगति के बस कैसे डाउनलोड किया जा सकता है। यही कारण है कि मैंने एक उत्तर लिखा है जो अतुल्यकालिक डाउनलोड और उत्तरोत्तर कार्यान्वयन में मदद करता है
Sayka

76

उपयोग करें 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
एसओ में आपका स्वागत है! आम तौर पर एक मौजूदा और पुराने प्रश्न के लिए कम-गुणवत्ता वाले उत्तर को पोस्ट करना एक अच्छा विचार नहीं है, जिसमें पहले से ही उच्च उत्कीर्ण उत्तर हैं।
ThiefMaster

28
मुझे अपने उत्तर को शॉन की टिप्पणी से मिला, लेकिन वास्तव में मैं दूसरों पर इस "कम गुणवत्ता वाले" उत्तर को पसंद करता हूं। यह पूर्ण (कथन का उपयोग करते हुए), संक्षिप्त और समझने में आसान है। एक पुराना सवाल है अप्रासंगिक, IMHO।
जोश

21
लेकिन यह सोचता है कि यूज़ करने के साथ उत्तर बहुत बेहतर है, क्योंकि, मुझे लगता है कि इस्तेमाल के बाद WebClient को निपटाना चाहिए। इसका उपयोग करके इसे अंदर रखना यह सुनिश्चित करता है कि इसका निपटान किया जाता है।
रिकार्डो पोलो जरामिलो

5
इस कोड के उदाहरण में
डिस्पोज़

17

कंसोल को स्टेटस प्रिंट करते हुए एक फाइल डाउनलोड करने के लिए पूरी क्लास।

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

उपयोग:

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

1
कृपया आप बता सकते हैं कि आप SemaphoreSlimइस संदर्भ में क्यों प्रयोग कर रहे हैं ?
mmushtaq

10

इसका उपयोग करके देखें:

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

फ़ाइल को कहाँ सहेजा जाएगा?
आईबी

फ़ाइल उस स्थान पर सहेजी जाएगी जहां निष्पादन योग्य फ़ाइल है। यदि आप पूर्ण पथ चाहते हैं, तो फ़ाइल के साथ पूर्ण पथ का उपयोग करें (जो कि डाउनलोड की जाने वाली वस्तु का फ़ाइल नाम है)
सुरेंद्र श्रेष्ठ

9

इसके अलावा आप WebClient वर्ग में DownloadFileAsync विधि का उपयोग कर सकते हैं। यह निर्दिष्ट URI वाले संसाधन को स्थानीय फ़ाइल में डाउनलोड करता है। साथ ही यह विधि कॉलिंग थ्रेड को ब्लॉक नहीं करती है।

नमूना:

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

अधिक जानकारी के लिए:

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


8

नेटवर्क से कनेक्ट GetIsNetworkAvailable()न होने पर खाली फाइल बनाने से बचने के लिए नेटवर्क कनेक्शन की जांच करें ।

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

मैं सुझाव देता हूं कि अपने अनुभव के अनुसार, बहुत से झूठे-सकारात्मक रिटर्न का उपयोग करें GetIsNetworkAvailable()
चेरोना

जब तक आप एक लैन जैसे कंप्यूटर नेटवर्क में न हों, GetIsNetworkAvailable()हमेशा सही तरीके से वापस आ जाएंगे। ऐसे मामले में आप System.Net.WebClient().OpenRead(Uri)यह देखने के लिए विधि का उपयोग कर सकते हैं कि क्या यह डिफ़ॉल्ट url दिए जाने पर वापस आता है। देखें WebClient.OpenRead ()
haZya

2

नीचे दिए गए कोड में मूल नाम के साथ डाउनलोड फ़ाइल के लिए तर्क हैं

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

अनुरोध करने से पहले आपको फ़ाइल को डाउनलोड करने या क्रेडेंशियल्स का उपयोग करने के लिए स्थिति जानने और एक ProgressBar को अपडेट करने की आवश्यकता हो सकती है।

यहां यह एक उदाहरण है, जो इन विकल्पों को कवर करता है। लैम्ब्डा नोटेशन और स्ट्रिंग इंटरपोलेशन का उपयोग किया गया है:

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

मेरे शोध के अनुसार मैंने पाया कि WebClient.DownloadFileAsyncफ़ाइल डाउनलोड करने का सबसे अच्छा तरीका है। यह System.Netनेमस्पेस में उपलब्ध है और यह .net कोर को भी सपोर्ट करता है।

फ़ाइल डाउनलोड करने के लिए यहाँ नमूना कोड है।

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

उपरोक्त कोड के साथ फाइल को tepdownloadप्रोजेक्ट की डायरेक्टरी के फोल्डर के अंदर डाउनलोड किया जाएगा । ऊपर दिए गए कोड को समझने के लिए कृपया कोड में टिप्पणी पढ़ें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.