Không cần thiết phải sử dụng System.Drawing
để tìm định dạng hình ảnh trong URI. System.Drawing
không khả dụng .NET Core
trừ 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.WebClient
vì 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 WebClient
lớ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.HttpClient
và 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.dots
trở 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.WriteAllBytes
nế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
HttpClient
cho 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 HttpClient
và xử lý đúng cách mà bạn có thể tìm thấy ở đây .