23.7K
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();
}
}
댓글