Không cần thiết phải sử dụng System.Drawingđể tìm định dạng hình ảnh trong URI. System.Drawingkhông khả dụng .NET Coretrừ khi bạn tải xuống gói NuGet System.Drawing.Common và do đó tôi không thấy bất kỳ câu trả lời đa nền tảng nào cho câu hỏi này.
Ngoài ra, ví dụ của tôi không sử dụng System.Net.WebClientvì Microsoft rõ ràng không khuyến khích việc sử dụngSystem.Net.WebClient .
Chúng tôi khuyên bạn không nên sử dụng WebClientlớp học để phát triển mới. Thay vào đó, hãy sử dụng lớp System.Net.Http.HttpClient .
Tải xuống hình ảnh và ghi nó vào tệp mà không cần biết phần mở rộng (nền tảng chéo) *
* Không có cũ System.Net.WebClient và System.Drawing.
Phương pháp này sẽ tải xuống không đồng bộ một hình ảnh (hoặc bất kỳ tệp nào miễn là URI có phần mở rộng tệp) bằng cách sử dụng System.Net.Http.HttpClientvà sau đó ghi nó vào một tệp, sử dụng cùng một phần mở rộng tệp như hình ảnh có trong URI.
Lấy phần mở rộng tệp
Phần đầu tiên của việc tải phần mở rộng tệp là xóa tất cả các phần không cần thiết khỏi URI.
Chúng tôi sử dụng Uri.GetLeftPart () với UriPartial.Path để tải mọi thứ từ Schemeđầu đến cuối Path.
Nói cách khác, https://www.example.com/image.png?query&with.dotstrở thànhhttps://www.example.com/image.png .
Sau đó, chúng tôi sử dụng Path.GetExtension () để chỉ lấy phần mở rộng (trong ví dụ trước của tôi, .png).
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
Đang tải xuống hình ảnh
Từ đây nó sẽ được thẳng về phía trước. Tải xuống hình ảnh bằng HttpClient.GetByteArrayAsync , tạo đường dẫn, đảm bảo thư mục tồn tại và sau đó ghi các byte vào đường dẫn bằng File.WriteAllBytesAsync () (hoặc File.WriteAllBytesnếu bạn đang sử dụng .NET Framework)
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);
}
Lưu ý rằng bạn cần sử dụng các lệnh sau.
using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;
Ví dụ sử dụng
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));
Ghi chú
- Thực tế là không tốt khi tạo mới
HttpClientcho mọi lệnh gọi phương thức. Nó phải được sử dụng lại trong toàn bộ ứng dụng. Tôi đã viết một ví dụ ngắn về ImageDownloader(50 dòng) kèm theo nhiều tài liệu hơn để sử dụng lại chính xác HttpClientvà xử lý đúng cách mà bạn có thể tìm thấy ở đây .