CREATE PROCEDURE GetImage @idx int AS BEGIN SET NOCOUNT ON; SELECT [FileName], [Image] FROM pictures WHERE idx = @idx END이미지의 인덱스(Idx) 값을 인자로 받아서 해당 인덱스에 저장된 이미지와 이미지의 원래 파일명을 가져옵니다.
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 문을 사용할 때 보다 코드를 간결하게 할 수 있는 장점이 있기 때문에 레코드가 하나인 경우에만 사용합니다(여러 레코드를 처리하는 경우에는 코드 수정이 거의 없다는 장점도 있습니다).
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(); } }
이전 글 : Trax, 그만의 코딩이야기(4) - 메모리를 고려한 최적화 2
다음 글 : 자바 애플리케이션 보안 요구사항의 발견 - 1
최신 콘텐츠