System.Drawing
URI में छवि प्रारूप को खोजने के लिए उपयोग करना आवश्यक नहीं है । जब तक आप System.Drawing.Common NuGet पैकेज डाउनलोड System.Drawing
नहीं करते हैं, .NET Core
तब तक यह उपलब्ध नहीं है और इसलिए मुझे इस प्रश्न का कोई अच्छा क्रॉस-प्लेटफ़ॉर्म उत्तर नहीं दिखता है।
इसके अलावा, मेरा उदाहरण उपयोग नहीं करता है System.Net.WebClient
क्योंकि Microsoft स्पष्ट रूप से उपयोग को हतोत्साहित करता हैSystem.Net.WebClient
।
हम अनुशंसा नहीं करते हैं कि आप WebClient
नए विकास के लिए कक्षा का उपयोग करें । इसके बजाय, System.Net.Http.HttpClient वर्ग का उपयोग करें ।
एक चित्र डाउनलोड करें और इसे विस्तार (क्रॉस प्लेटफॉर्म) को जाने बिना एक फाइल पर लिखें *
* वर्ष के बिना System.Net.WebClient
और System.Drawing
।
यह विधि एसिंक्रोनस रूप से एक छवि को डाउनलोड करेगी (या जब तक कि यूआरआई के पास कोई फ़ाइल नहीं है) का उपयोग करके System.Net.Http.HttpClient
और फिर उसी फ़ाइल एक्सटेंशन का उपयोग करके एक फ़ाइल में लिखें, जैसा कि छवि का यूआरआई में था।
फ़ाइल एक्सटेंशन प्राप्त करना
फ़ाइल एक्सटेंशन प्राप्त करने का पहला हिस्सा यूआरआई से सभी अनावश्यक भागों को हटा रहा है।
हम सब कुछ पाने के लिए Uri.GetLeftPart () का उपयोग UriPartial.Path के साथ Scheme
करते हैं Path
।
दूसरे शब्दों में, https://www.example.com/image.png?query&with.dots
बन जाता है https://www.example.com/image.png
।
उसके बाद, हम केवल एक्सटेंशन (मेरे पिछले उदाहरण में ) प्राप्त करने के लिए Path.GetExtension () का उपयोग करते हैं .png
।
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
छवि डाउनलोड कर रहा है
यहां से यह सीधे आगे होना चाहिए। HttpClient.GetByteArrayAsync के साथ छवि डाउनलोड करें , पथ बनाएँ, निर्देशिका मौजूद है और फिर फ़ाइल के साथ पथ को बाइट्स लिखें। 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
और इसे ठीक से निपटान करता है जिसे आप यहां पा सकते हैं ।