System.DrawingURI में छवि प्रारूप को खोजने के लिए उपयोग करना आवश्यक नहीं है । जब तक आप 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और इसे ठीक से निपटान करता है जिसे आप यहां पा सकते हैं ।