메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

ASP.NET - 데이터베이스에서 이미지를 가져오기

한빛미디어

|

2007-02-20

|

by HANBIT

20,045

저자: 한동훈

저번 기사에서는 데이터베이스에 이미지를 저장하는 방법을 살펴봤습니다. 이번 시간에는 데이터베이스에 저장된 이미지를 가져오는 방법을 살펴보겠습니다. 핵심 처리는 윈도우 응용프로그램이나 웹 응용프로그램에 관계없이 동일합니다.

먼저, SQL Server에서 이미지를 가져올 때 사용할 저장프로시저를 작성합니다. 저장프로시저의 이름은 "GetImage"입니다.
CREATE PROCEDURE GetImage
  @idx int
AS
BEGIN
  SET NOCOUNT ON;

  SELECT [FileName], [Image]
  FROM pictures
  WHERE idx = @idx
END
이미지의 인덱스(Idx) 값을 인자로 받아서 해당 인덱스에 저장된 이미지와 이미지의 원래 파일명을 가져옵니다.

다음은 ASP.NET 응용프로그램을 작성합니다. 파일 이름은 View.aspx로 합니다. 프로그램에서 사용할 네임스페이스를 추가합니다.
using System.Data.SqlClient;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
다음은 페이지를 로딩할 때 실행되는 Page_Load() 함수를 수정합니다. 가져올 이미지의 Idx 값은 View.aspx?idx=1 과 같이 쿼리스트링을 사용합니다. Idx 값이 없는 경우에는 프로그램 실행을 중단합니다. 프로그램 실행을 중단하기 위해 Response.End()를 사용했습니다.
protected void Page_Load(object sender, EventArgs e)
  {
    if (Request.QueryString["idx"] == null)
    {
      Response.End();
    }
    else
    {
      GetImage(Request.QueryString["idx"]);
    }
  }
쿼리스트링으로 전달된 값이 있으면 GetImage() 함수를 사용해서 나머지 처리를 수행합니다. GetImage() 함수의 구현은 다음과 같습니다.
  private void GetImage(string idx)
  {
    SqlConnection sc = null;
    SqlCommand scmd = null;
    SqlDataReader sdr = null;

    sc = new SqlConnection("Data Source=(local); 
        Initial Catalog=pictures; Integrated Security=True;");
    scmd = new SqlCommand("GetImage", sc);
    scmd.CommandType = CommandType.StoredProcedure;

    SqlParameter spIdx = new SqlParameter("@idx", SqlDbType.Int);
    spIdx.Value = idx;

    scmd.Parameters.Add(spIdx);

    sc.Open();
    sdr = scmd.ExecuteReader();
SqlConnection 클래스를 사용해서 연결을 생성하고, SqlCommand 클래스에서는 GetImage 저장프로시저를 설정합니다. SqlParameter 클래스는 매개변수 idx를 설정합니다. 연결을 연 다음에는 ExecuteReader() 함수를 사용해서 쿼리를 실행하고 결과값을 SqlDataReader 클래스로 받습니다.
    while (sdr.Read())
    {
      byte[] image = (byte[])sdr["Image"];
      MemoryStream ms = new MemoryStream(image, 0, image.Length);
      Bitmap bitmap = new Bitmap(ms);
      Response.ContentEncoding = System.Text.Encoding.UTF8;
      Response.ContentType = "image/jpeg";
      Response.AddHeader("Content-Disposition", "attachment; filename="
         + Server.UrlEncode(sdr["FileName"].ToString()));
      
      bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
    }
sdr.Read() 함수를 호출해서 데이터를 읽어옵니다. 보통은 Read() 함수를 호출해서 결과값이 NULL 인지 아닌지를 확인하는 if 문을 사용해야 하지만, 레코드의 값이 하나 뿐이기 때문에 while() 문을 사용했습니다. if 문을 사용할 때 보다 코드를 간결하게 할 수 있는 장점이 있기 때문에 레코드가 하나인 경우에만 사용합니다(여러 레코드를 처리하는 경우에는 코드 수정이 거의 없다는 장점도 있습니다).

데이터베이스에서 읽어온 이미지 정보는 이진 파일입니다. 따라서, 바이트의 배열로 변환합니다. Bitmap 클래스를 사용하면 데이터를 비트맵 이미지로 만들 수 있습니다. 생성자 중에 하나가 스트림을 받아서 이미지로 변환하는 기능이므로 이를 이용합니다.

파일로 전달되는 이미지가 아니기 때문에 브라우저에 이미지에 대한 정보를 알려줘야 합니다. 따라서, HTTP 헤더를 이용해서 이미지라는 것을 알려줍니다. 또한, 이미지의 파일이름을 알려주기 위해 헤더를 추가합니다. 마지막은 Save() 함수를 호출해서 이미지를 Response.OutputStream으로 출력하며, 이미지 포맷은 Jpeg으로 지정합니다.

다음은 데이터베이스에서 가져온 이미지를 화면에 출력하는 전체 소스코드입니다. 페이지는 View.aspx이며, UI에는 어떤 코드도 작성하지 않습니다.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Data.SqlClient;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;

public partial class View : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    if (Request.QueryString["idx"] == null)
    {
      Response.End();
    }
    else
    {
      GetImage(Request.QueryString["idx"]);
    }
  }

  private void GetImage(string idx)
  {

    SqlConnection sc = null;
    SqlCommand scmd = null;
    SqlDataReader sdr = null;

    sc = new SqlConnection("Data Source=(local); 
      Initial Catalog=pictures; Integrated Security=True;");
    scmd = new SqlCommand("GetImage", sc);
    scmd.CommandType = CommandType.StoredProcedure;

    SqlParameter spIdx = new SqlParameter("@idx", SqlDbType.Int);
    spIdx.Value = idx;

    scmd.Parameters.Add(spIdx);

    sc.Open();
    sdr = scmd.ExecuteReader();

    while (sdr.Read())
    {
      byte[] image = (byte[])sdr["Image"];
      MemoryStream ms = new MemoryStream(image, 0, image.Length);
      Bitmap bitmap = new Bitmap(ms);
      System.Drawing.Image im = System.Drawing.Image.FromStream(ms);
      Response.ContentEncoding = System.Text.Encoding.UTF8;


      Response.ContentType = "image/jpeg";
      Response.AddHeader("Content-Disposition", "attachment; filename="
         + Server.UrlEncode(sdr["FileName"].ToString()));
      
      bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
    }

    sdr.Close();
    sc.Close();
    sc.Dispose();
    scmd.Dispose();
    sdr.Dispose();
  }
}
TAG :
댓글 입력
자료실