কীভাবে ইউআরএল থেকে চিত্র ডাউনলোড করবেন


107

লিঙ্কের শেষে যদি ইউআরএলটির কোনও চিত্র বিন্যাস না থাকে তবে সি # তে কোনও ইউআরএল থেকে সরাসরি চিত্র ডাউনলোড করার কোনও উপায় আছে কি? ইউআরএল এর উদাহরণ:

https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t34.0-12/10555140_10201501435212873_1318258071_n.jpg?oh=97ebc03895b7acee9aebbde7d6b002bf&oe=53C9ABB0&__gda__=1405685729_110e04e71d969d392b63b27ec4f4b24a

Url যখন কোনও চিত্র বিন্যাসের সাথে শেষ হয় তখন কীভাবে চিত্রটি ডাউনলোড করতে হয় তা আমি জানি। যেমন:

http://img1.wikia.nocookie.net/__cb20101219155130/uncyclopedia/images/7/70/Facebooklogin.png

উত্তর:


141

সহজভাবে আপনি নিম্নলিখিত পদ্ধতি ব্যবহার করতে পারেন।

using (WebClient client = new WebClient()) 
{
    client.DownloadFile(new Uri(url), @"c:\temp\image35.png");
    // OR 
    client.DownloadFileAsync(new Uri(url), @"c:\temp\image35.png");
}

এই পদ্ধতিগুলি প্রায় ডাউনলোড স্ট্রিং (..) এবং ডাউনলোড স্ট্রিংএসিঙ্ক (...) এর মতো। তারা ফাইলটিকে সি # স্ট্রিংয়ের পরিবর্তে ডিরেক্টরিতে সঞ্চয় করে এবং ইউআরআইতে ফর্ম্যাট এক্সটেনশনের প্রয়োজন নেই

আপনি যদি চিত্রটির ফর্ম্যাট (.png, .jpeg ইত্যাদি) না জানেন

public void SaveImage(string filename, ImageFormat format)
{    
    WebClient client = new WebClient();
    Stream stream = client.OpenRead(imageUrl);
    Bitmap bitmap;  bitmap = new Bitmap(stream);

    if (bitmap != null)
    {
        bitmap.Save(filename, format);
    }

    stream.Flush();
    stream.Close();
    client.Dispose();
}

এটি ব্যবহার করছি

try
{
    SaveImage("--- Any Image Path ---", ImageFormat.Png)
}
catch(ExternalException)
{
    // Something is wrong with Format -- Maybe required Format is not 
    // applicable here
}
catch(ArgumentNullException)
{   
    // Something wrong with Stream
}


4
@ আরসমান আহমদ এটি সম্পূর্ণ আলাদা প্রশ্ন, যা অন্য কোথাও খোঁজা বা জিজ্ঞাসা করা উচিত। এই থ্রেডটি একটি একক চিত্র ডাউনলোড করার জন্য।
আজএনজো

79

আপনি চিত্রের ফর্ম্যাটটি জানেন কিনা তা নির্ভর করে এখানে আপনি এটি করতে পারেন এমন উপায়গুলি:

চিত্রের ফর্ম্যাটটি জেনে কোনও ফাইলে চিত্র ডাউনলোড করুন

using (WebClient webClient = new WebClient()) 
{
   webClient.DownloadFile("http://yoururl.com/image.png", "image.png") ; 
}

চিত্রের ফর্ম্যাটটি না জেনে কোনও ফাইলটিতে চিত্র ডাউনলোড করুন

আপনি যে Image.FromStreamকোনও ধরণের সাধারণ বিটম্যাপগুলি লোড করতে ব্যবহার করতে পারেন (jpg, png, bmp, gif, ...), এটি ফাইলের ধরণটি স্বয়ংক্রিয়ভাবে সনাক্ত করবে এবং আপনার ইউআরএল এক্সটেনশনও পরীক্ষা করতে হবে না (এটি খুব ভাল নয়) অনুশীলন করা). যেমন:

using (WebClient webClient = new WebClient()) 
{
    byte [] data = webClient.DownloadData("https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t34.0-12/10555140_10201501435212873_1318258071_n.jpg?oh=97ebc03895b7acee9aebbde7d6b002bf&oe=53C9ABB0&__gda__=1405685729_110e04e71d9");

   using (MemoryStream mem = new MemoryStream(data)) 
   {
       using (var yourImage = Image.FromStream(mem)) 
       { 
          // If you want it as Png
           yourImage.Save("path_to_your_file.png", ImageFormat.Png) ; 

          // If you want it as Jpeg
           yourImage.Save("path_to_your_file.jpg", ImageFormat.Jpeg) ; 
       }
   } 

}

দ্রষ্টব্য: Image.FromStreamডাউনলোড করা সামগ্রীটি পরিচিত চিত্রের ধরণের না হলে আর্গুমেন্টএক্সেপশন নিক্ষেপ করা হতে পারে ।

পরীক্ষা করে দেখুন দুটিই MSDN এই রেফারেন্স সব বিন্যাস প্রাপ্তিসাধ্য খুঁজে। এখানে রেফারেন্স হয় WebClientএবং Bitmap


4
নোট করুন যে আপনার "সিস্টেম.ড্রয়িং ব্যবহার করে" দরকার; Image.FromStream জন্য ()
dlchambers

4
নোট করুন যে চিত্রের ফর্ম্যাটটি সনাক্ত করতে ইমেজিং লাইব্রেরিটি জিজ্ঞাসা করার পরিবর্তে আপনি প্রতিক্রিয়া শিরোনামগুলিতেও দেখতে পারেন উত্সটি কোন ধরণের ফর্ম্যাটটি ব্যবহার করছে তা দেখার জন্যwebClient.ResponseHeaders["Content-Type"]
বাইকম্যান868

এটাও একটি ডিকম্প্রেস করা বিটম্যাপ বস্তুর মধ্যে সংকুচিত ইমেজ বিস্তৃত চেয়ে অনেক বেশী মেমরি দক্ষ হবে এবং আপনি ইমেজ এর আসল ফর্ম্যাটে তার মূল কম্প্রেশন সঙ্গে ইত্যাদি সংরক্ষণ করতে সম্ভব হবে
bikeman868

20

যে কোনও ছবিতে ফাইলটি সংরক্ষণ না করেই ডাউনলোড করতে চান তার জন্য:

Image DownloadImage(string fromUrl)
{
    using (System.Net.WebClient webClient = new System.Net.WebClient())
    {
        using (Stream stream = webClient.OpenRead(fromUrl))
        {
            return Image.FromStream(stream);
        }
    }
}

13

System.Drawingকোনও ইউআরআইতে চিত্রের ফর্ম্যাটটি খুঁজতে এটি ব্যবহার করার দরকার নেই। আপনি সিস্টেম.ড্রেইং.কমন নুগেট প্যাকেজটি ডাউনলোড System.Drawingনা করা পর্যন্ত উপলভ্য নয় এবং অতএব আমি এই প্রশ্নের কোনও ভাল ক্রস প্ল্যাটফর্মের উত্তর দেখতে পাচ্ছি না।.NET Core

এছাড়াও, মাইক্রোসফ্ট স্পষ্টভাবে এর ব্যবহারকে নিরুৎসাহিত করারSystem.Net.WebClient কারণে আমার উদাহরণ ব্যবহার করে না ।System.Net.WebClient

আমরা আপনাকে WebClientনতুন বিকাশের জন্য ক্লাসটি ব্যবহার করার পরামর্শ দিচ্ছি না । পরিবর্তে, System.Net.Http.Http ক্লায়েন্ট ক্লাসটি ব্যবহার করুন ।

একটি ইউআরএল থেকে একটি ছবি ডাউনলোড করুন এবং একটি ফাইল (ক্রস প্ল্যাটফর্ম) এ লিখুন *

* পুরানো ছাড়া System.Net.WebClientএবং System.Drawing

এই পদ্ধতিটি অ্যাসিঙ্ক্রোনসিভভাবে একটি চিত্র (বা কোনও ফাইল ইউআরআই ফাইলের প্রসারিত হওয়া অবধি) ডাউনলোড করবে System.Net.Http.HttpClientএবং তারপরে ছবিটিতে ইউআরআই-তে থাকা একই ফাইল এক্সটেনশনটি ব্যবহার করে কোনও ফাইলে এটি লিখবে।

ফাইল এক্সটেনশন পাচ্ছেন

ফাইল এক্সটেনশান পাওয়ার প্রথম অংশটি ইউআরআই থেকে সমস্ত অপ্রয়োজনীয় অংশ সরিয়ে দিচ্ছে।
আমরা UriPartial.Path এর সাথে Uri.GetLeftPart () ব্যবহার করি যা Schemeআপ থেকে শুরু করে সমস্ত কিছু পেতে Path
অন্য কথায়, https://www.example.com/image.png?query&with.dotsহয়ে যায় https://www.example.com/image.png

এর পরে, আমরা কেবলমাত্র এক্সটেনশনটি পেতে (আমার আগের উদাহরণে ) পাথ.গেট এক্সটেনশন ( .png) ব্যবহার করি।

var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);

ছবিটি ডাউনলোড করা হচ্ছে

এখান থেকে এটি সরাসরি এগিয়ে হওয়া উচিত। সঙ্গে চিত্র ডাউনলোড করার HttpClient.GetByteArrayAsync ডিরেক্টরি উপস্থিত রয়েছে নিশ্চিত করা, পথ তৈরি করুন এবং তারপর সঙ্গে পথে বাইট লিখতে File.WriteAllBytesAsync () (অথবা File.WriteAllBytesযদি আপনি .NET ফ্রেমওয়ার্ক রয়েছে)

private async Task DownloadImageAsync(string directoryPath, string fileName, Uri uri)
{
    using var httpClient = new HttpClient();

    // Get the file extension
    var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
    var fileExtension = Path.GetExtension(uriWithoutQuery);

    // Create file path and ensure directory exists
    var path = Path.Combine(directoryPath, $"{fileName}{fileExtension}");
    Directory.CreateDirectory(directoryPath);

    // Download the image and write to the file
    var imageBytes = await _httpClient.GetByteArrayAsync(uri);
    await File.WriteAllBytesAsync(path, imageBytes);
}

নোট করুন যে আপনার নিম্নলিখিত নির্দেশাবলী ব্যবহার করে প্রয়োজন।

using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;

ব্যবহারের উদাহরণ

var folder = "images";
var fileName = "test";
var url = "https://cdn.discordapp.com/attachments/458291463663386646/592779619212460054/Screenshot_20190624-201411.jpg?query&with.dots";

await DownloadImageAsync(folder, fileName, new Uri(url));

মন্তব্য

  • HttpClientপ্রতিটি পদ্ধতি কলের জন্য একটি নতুন তৈরি করা খারাপ অভ্যাস । এটি পুরো অ্যাপ্লিকেশন জুড়ে পুনরায় ব্যবহার করার কথা। আমি ImageDownloaderআরও একটি ডকুমেন্টেশন সহ একটি (50 টি লাইন) এর একটি সংক্ষিপ্ত উদাহরণ লিখেছি যা সঠিকভাবে HttpClientএটির পুনরায় ব্যবহার করে এবং সঠিকভাবে নিষ্পত্তি করে যা আপনি এখানে খুঁজে পেতে পারেন ।

5

.NET ফ্রেমওয়ার্ক পিকচারবক্স নিয়ন্ত্রণ থেকে url থেকে চিত্রগুলি লোড করতে দেয়

এবং লড সম্পূর্ণ ইভেন্টে চিত্র সংরক্ষণ করুন

protected void LoadImage() {
 pictureBox1.ImageLocation = "PROXY_URL;}

void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e) {
   pictureBox1.Image.Save(destination); }

4

এটি আমার জন্য কাজ করে দেখুন

আপনার নিয়ামক এ এটি লিখুন

public class DemoController: Controller

        public async Task<FileStreamResult> GetLogoImage(string logoimage)
        {
            string str = "" ;
            var filePath = Server.MapPath("~/App_Data/" + SubfolderName);//If subfolder exist otherwise leave.
            // DirectoryInfo dir = new DirectoryInfo(filePath);
            string[] filePaths = Directory.GetFiles(@filePath, "*.*");
            foreach (var fileTemp in filePaths)
            {
                  str= fileTemp.ToString();
            }
                return File(new MemoryStream(System.IO.File.ReadAllBytes(str)), System.Web.MimeMapping.GetMimeMapping(str), Path.GetFileName(str));
        }

এখানে আমার মতামত

<div><a href="/DemoController/GetLogoImage?Type=Logo" target="_blank">Download Logo</a></div>

1

আমি যে পোস্টগুলি পেয়েছি তার বেশিরভাগই দ্বিতীয় পুনরাবৃত্তির পরে শেষ হয়ে যাবে। বিশেষত আপনি যদি গুচ্ছের মধ্য দিয়ে লুপিং করেন তবে আমার মতো চিত্রগুলি। সুতরাং উপরোক্ত পরামর্শগুলি উন্নত করা সম্পূর্ণ পদ্ধতি:

public System.Drawing.Image DownloadImage(string imageUrl)
    {
        System.Drawing.Image image = null;

        try
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(imageUrl);
            webRequest.AllowWriteStreamBuffering = true;
            webRequest.Timeout = 30000;
            webRequest.ServicePoint.ConnectionLeaseTimeout = 5000;
            webRequest.ServicePoint.MaxIdleTime = 5000;

            using (System.Net.WebResponse webResponse = webRequest.GetResponse())
            {

                using (System.IO.Stream stream = webResponse.GetResponseStream())
                {
                    image = System.Drawing.Image.FromStream(stream);
                }
            }

            webRequest.ServicePoint.CloseConnectionGroup(webRequest.ConnectionGroupName);
            webRequest = null; 
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);

        }


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