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
.
이 메서드는를 사용하여 이미지 (또는 URI에 파일 확장자가있는 한 모든 파일)를 비동기 적으로 다운로드 한 System.Net.Http.HttpClient
다음 URI에있는 이미지와 동일한 파일 확장자를 사용하여 파일에 씁니다.
파일 확장자 얻기
파일 확장자를 얻는 첫 번째 부분은 URI에서 불필요한 부분을 모두 제거하는 것입니다. UriPartial.Path 와 함께 Uri.GetLeftPart () 를
사용 하여 .
즉, 이된다 .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();
// 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 지시문이 필요합니다.
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
올바르게 재사용 HttpClient
하고 적절하게 처리 하는 더 많은 문서와 함께 (50 줄) 의 짧은 예제를 작성했습니다 .