সি # তে ইউআরএল থেকে ফাইল ডাউনলোড করবেন কীভাবে?


350

ইউআরএল পথ থেকে কোনও ফাইল ডাউনলোড করার সহজ উপায় কী?


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

এমএসডিএন ডক এর পরিবর্তে এখন এইচটিপিপ্লিনেন্ট ব্যবহার করার কথা উল্লেখ করেছে: ডকস.মাইক্রোসফট.ফেন
ডটনেট

যদিও আমি মনে করি যে ওয়েবক্লিয়েন্টটিকে অনেক বেশি সরল ও সহজ সমাধান বলে মনে হচ্ছে।
২৩:১ng এ

1
@ কোপা017: বা একটি বিপজ্জনক, যদি উদাহরণস্বরূপ, ইউআরএল ব্যবহারকারী দ্বারা সরবরাহ করা হয় এবং সি # কোডটি একটি ওয়েব সার্ভারে চলমান।
হেইনজি

177

এই নেমস্পেসটি অন্তর্ভুক্ত করুন

using System.Net;

ডাউনলোড অ্যাসিঙ্ক্রোনাস এবং করা ProgressBar নিজেই থ্রেড UI 'তে মধ্যে ডাউনলোডের অবস্থা দেখানোর জন্য

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
প্রশ্নটি সহজ উপায় জিজ্ঞাসা করে। আরও জটিল করা সহজতর করে তোলে না।
বুদ্ধিমানতা

75
ডাউনলোড করার সময় বেশিরভাগ লোক একটি অগ্রগতি বার পছন্দ করে। সুতরাং আমি এটি করতে সহজ উপায় লিখেছি। এটি উত্তর নাও হতে পারে তবে এটি স্ট্যাকওভারফ্লোয়ের প্রয়োজনীয়তা পূরণ করে। তা হচ্ছে কাউকে সাহায্য করা।
সায়কা

3
আপনি কেবল অগ্রগতি বারটি ছেড়ে দিলে এটি অন্যান্য উত্তরের মতোই সহজ। এই উত্তরে নেমস্পেসও অন্তর্ভুক্ত এবং I / O এর জন্য async ব্যবহার করা হয়েছে uses এছাড়াও প্রশ্নটি সহজতম উপায়, কেবল একটি সহজ উপায়ের জন্য জিজ্ঞাসা করে না। :)
জোশ

আমি মনে করি 2 টি উত্তর দেওয়ার একটি সহজ এবং একটি অগ্রগতি বারের সাথে দেওয়া আরও ভাল
জেসি দে গ্যানস

@ জেসেদেগানস ইতিমধ্যে একটি উত্তর রয়েছে যা দেখায় যে কীভাবে প্রগতি বার ছাড়াই ডাউনলোড করবেন download আমি কেন এমন উত্তর লিখলাম যা
অ্যাসিক্রোনাস

75

ব্যবহার 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
তাই আপনাকে স্বাগতম! সাধারণত ইতিমধ্যে অত্যন্ত আপত্তিযুক্ত উত্তর রয়েছে এমন একটি বিদ্যমান এবং পুরাতন প্রশ্নের নিম্নমানের উত্তর পোস্ট করা ভাল ধারণা নয়।
চোরমাস্টার

28
আমি সানব এর মন্তব্য থেকে আমার উত্তর পেয়েছি, তবে সত্যই আমি অন্যের চেয়ে এই "নিম্ন-মানের" উত্তরটি পছন্দ করি। এটি সম্পূর্ণ (বিবৃতি ব্যবহার করে), সংক্ষিপ্ত এবং বুঝতে সহজ। পুরানো প্রশ্ন হওয়া অপ্রাসঙ্গিক, আইএমএইচও।
জোশ

21
তবে এটি মনে করে ব্যবহারের সাথে উত্তরটি আরও ভাল, কারণ আমি মনে করি যে ওয়েবক্লিয়েন্টটি ব্যবহারের পরে নিষ্পত্তি করা উচিত। এটি ব্যবহার করে ভিতরে রাখা নিশ্চিত করে যে এটি নিষ্পত্তি হয়েছে।
রিকার্ডো পোলো জারামিলো

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এই প্রসঙ্গে ব্যবহার করছেন?
মিমুশতাক

10

এটি ব্যবহার করার চেষ্টা করুন:

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

ফাইলটি কোথায় সেভ হবে?
আইবি

এক্সিকিউটেবল ফাইল যেখানে অবস্থিত সেখানে ফাইলটি সংরক্ষণ করা হবে। আপনি যদি পুরো পথ চান তবে ফাইলের সাথে পুরো পথটি ব্যবহার করুন (যা ডাউনলোড করার জন্য আইটেমের ফাইল নাম)
সুরেন্দ্র শ্রেষ্ঠ

9

এছাড়াও আপনি ওয়েবক্লায়েন্ট ক্লাসে ডাউনলোডফাইএলসিঙ্ক পদ্ধতি ব্যবহার করতে পারেন। এটি স্থানীয় ফাইলগুলিতে নির্দিষ্ট ইউআরআই সহ সংস্থানটি ডাউনলোড করে। এছাড়াও এই পদ্ধতিটি কলিং থ্রেডটিকে ব্লক করে না।

নমুনা:

    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

অনুরোধ করার আগে আপনার ফাইলটি ডাউনলোড করার সময় বা স্টিগ্রেইনসিয়াল ব্যবহার করার সময় আপনার স্ট্যাটাসটি জানতে হবে এবং একটি প্রগ্রেসবার আপডেট করতে হবে।

এই বিকল্পগুলির মধ্যে এটি একটি উদাহরণ যা এখানে। ল্যাম্বদা স্বরলিপি এবং স্ট্রিং অন্তরঙ্গকরণ ব্যবহৃত হয়েছে:

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নেমস্পেসে উপলভ্য এবং এটি নেট নেটও সমর্থন করে।

ফাইলটি ডাউনলোড করার জন্য নমুনা কোডটি এখানে।

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প্রকল্পের ডিরেক্টরিটির ফোল্ডারের অভ্যন্তরে ডাউনলোড করা হবে । উপরের কোডটি কী করে তা বুঝতে দয়া করে কোডটিতে মন্তব্য পড়ুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.