ไม่จำเป็นต้องใช้System.Drawing
เพื่อค้นหารูปแบบภาพใน URI System.Drawing
ไม่สามารถใช้งานได้.NET Core
เว้นแต่คุณจะดาวน์โหลดแพ็คเกจ System.Drawing.Common NuGetดังนั้นฉันจึงไม่เห็นคำตอบข้ามแพลตฟอร์มที่ดีสำหรับคำถามนี้
นอกจากนี้ตัวอย่างของฉันไม่ได้ใช้System.Net.WebClient
เนื่องจากMicrosoft ไม่สนับสนุนการใช้System.Net.WebClient
ไฟล์.
เราไม่แนะนำให้คุณใช้WebClient
คลาสสำหรับการพัฒนาใหม่ ให้ใช้คลาส System.Net.Http.HttpClientแทน
ดาวน์โหลดภาพจาก URL และเขียนลงในไฟล์ (ข้ามแพลตฟอร์ม) *
* ไม่มีเก่าSystem.Net.WebClient
และSystem.Drawing
.
วิธีนี้จะดาวน์โหลดรูปภาพแบบอะซิงโครนัส (หรือไฟล์ใดก็ได้ตราบเท่าที่ URI มีนามสกุลไฟล์) โดยใช้ไฟล์System.Net.Http.HttpClient
แล้วเขียนลงในไฟล์โดยใช้นามสกุลไฟล์เดียวกับรูปภาพใน URI
รับนามสกุลไฟล์
ส่วนแรกของการรับนามสกุลไฟล์คือการลบส่วนที่ไม่จำเป็นทั้งหมดออกจาก URI
เราใช้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สร้างเส้นทางตรวจสอบให้แน่ใจว่ามีไดเร็กทอรีอยู่จากนั้นเขียนไบต์ไปยังพา ธ ด้วยFile.WriteAllBytesAsync () (หรือFile.WriteAllBytes
ถ้าคุณอยู่บน. NET Framework)
private async Task DownloadImageAsync(string directoryPath, string fileName, Uri uri)
{
using var httpClient = new HttpClient();
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
var path = Path.Combine(directoryPath, $"{fileName}{fileExtension}");
Directory.CreateDirectory(directoryPath);
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 เส้น) พร้อมกับเอกสารอื่น ๆ ที่ถูกต้อง reuses HttpClient
และต้องพ้นจากมันที่คุณสามารถหาที่นี่