이번 글에서는 웹상에서 이미지를 다운로드 하여 파일명을 오늘날짜로 하여 저장하는 방법에 대해 알아보도록 하겠습니다.
C# Web Image Download 방식은 HttpClient 클래스를 이용합니다.
HttpClient 클래스
HTTP 요청을 보내고 URI로 식별된 리소스에서 HTTP 응답을 수신하기 위한 클래스를 제공합니다.
그중 다음 메서드가 중요 합니다.
GetAsync(Uri) : GET 요청을 지정된 URI에 비동기 작업으로 보냅니다.
예제 코드
다음 예제 코드에서 이미지를 다운받아 오늘날짜 파일로 저장하는 풀 소스코드를 보여드립니다.
파일명은 현재 시간 확장자는 파일종류를 파악하여 저장합니다.
class Program
{
static void Main(string[] args)
{
downLoadImage("https://www.google.co.kr/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png");
Console.ReadLine();
}
public static async void downLoadImage(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
HttpResponseMessage rms = response.EnsureSuccessStatusCode();
// 파일명은 현재날짜로 저장
string fileName = DateTime.Now.ToString("yyyyMMddhhmmss");
// 이미지 종류를 파악하고 저장 하게될 확장자를 결정한다.
var mediaType = response.Content.Headers.ContentType.MediaType;
if (mediaType.IndexOf("jpg", StringComparison.OrdinalIgnoreCase) >= 0
|| mediaType.IndexOf("jpeg", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".jpg";
}
else if (mediaType.IndexOf("png", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".png";
}
else if (mediaType.IndexOf("gif", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".gif";
}
else if (mediaType.IndexOf("bmp", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".bmp";
}
else
{
fileName += ".png";
}
byte[] content = await response.Content.ReadAsByteArrayAsync();
System.IO.File.WriteAllBytes(fileName, content);
}
}
}
위 코드는 google logo 이미지를 를 받아 파일로 저장하는 풀소스코드입니다.
간략하게 설명드리면
다음 코드에서 HttpClient 객체를 생성합니다.
using (HttpClient client = new HttpClient())
GET 요청을 지정된 URI에 비동기 작업으로 보냅니다. 이코드에서 실제로 파일을 비동기로 다운로드 하게 됩니다.
HttpResponseMessage response = await client.GetAsync(url);
결과를 확인하기 위하여 넣은 코드 입니다.
만약 파일 다운로드 실패하였을경우 HttpRequestException 을 throw 합니다.
성공하였을경우 StatusCode 200 을 리턴할 것입니다.
HttpResponseMessage rms = response.EnsureSuccessStatusCode();
참고로 위 코드에 대한 catch 문장은 없는 상태 입니다.
다음 코드로 확장자를 결정할 수 있습니다.
var mediaType = response.Content.Headers.ContentType.MediaType;
if (mediaType.IndexOf("jpg", StringComparison.OrdinalIgnoreCase) >= 0
|| mediaType.IndexOf("jpeg", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".jpg";
}
else if (mediaType.IndexOf("png", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".png";
}
else if (mediaType.IndexOf("gif", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".gif";
}
else if (mediaType.IndexOf("bmp", StringComparison.OrdinalIgnoreCase) >= 0)
{
fileName += ".bmp";
}
else
{
fileName += ".png";
}
이제 다운받은 파일을 byte[] 로 받는 코드 입니다.
byte[] content = await response.Content.ReadAsByteArrayAsync();
다음 문장으로 간단하게 파일로 저장합니다.
System.IO.File.WriteAllBytes(fileName, content);
결론
웹상 이미지를 간단하게 파일로 저장하는 코드를 보여드렸습니다.