C# Web Image Download : 웹상 이미지를 파일로 저장하자

이번 글에서는 웹상에서 이미지를 다운로드 하여 파일명을 오늘날짜로 하여 저장하는 방법에 대해 알아보도록 하겠습니다.
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);

결론

웹상 이미지를 간단하게 파일로 저장하는 코드를 보여드렸습니다.

Leave a Comment