CREATE PROCEDURE InsertImage @FileName nvarchar(250), @Image image, @Idx int output AS BEGIN SET NOCOUNT ON; INSERT INTO pictures( FileName, Image ) VALUES ( @FileName, @Image ) SELECT @idx = SCOPE_IDENTITY(); END GO저장 프로시저를 작성했으면 새로운 ASP.NET 프로젝트를 생성합니다. 여기서는 비주얼 스튜디오 2005를 사용하며, ASP.NET 2.0을 사용합니다. 실제로는 ASP.NET 1.1로 해도 큰 차이는 없습니다. 새로운 ASP.NET 페이지 이름은 Upload.aspx로 하고, 다음과 같이 FileUpload 컨트롤과 Button 컨트롤을 배치합니다. 컨트롤의 이름은 각각 fuControl, btnUpload로 설정합니다.
using System; using System.Data; using System.Configuration; 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; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnUpload_Click(object sender, EventArgs e) { string fileName = fuControl.PostedFile.FileName; fileName = System.IO.Path.GetFileName(fileName); fileName = Server.HtmlEncode(fileName); int fileSize = fuControl.PostedFile.ContentLength; Stream stream = fuControl.FileContent; byte[] image = new byte[fuControl.PostedFile.ContentLength]; stream.Read(image, 0, fuControl.PostedFile.ContentLength); stream.Close(); SqlConnection sc = new SqlConnection( "Data Source=(local); Initial Catalog=pictures; Integrated Security=True;"); SqlCommand scmd = new SqlCommand("InsertImage", sc); scmd.CommandType = CommandType.StoredProcedure; SqlParameter spIdx = new SqlParameter("@idx", SqlDbType.Int); spIdx.Direction = ParameterDirection.Output; SqlParameter spFilename = new SqlParameter("@FileName", SqlDbType.NVarChar, 250); spFilename.Value = fileName; SqlParameter spImage = new SqlParameter("@Image", SqlDbType.Image); spImage.Value = image; scmd.Parameters.Add(spIdx); scmd.Parameters.Add(spFilename); scmd.Parameters.Add(spImage); sc.Open(); scmd.ExecuteNonQuery(); sc.Close(); int newIdx = (int)spIdx.Value; Response.Write("새로운 IDX는 " + newIdx.ToString() + "입니다"); sc.Dispose(); scmd.Dispose(); Response.Redirect(Request.ServerVariables["SCRIPT_NAME"]); } }파일 업로드를 처리하기 위해 System.IO 네임스페이스를 추가하고, DB를 사용하기 위해 System.Data.SqlClient 네임스페이스를 추가합니다. 파일이름으로 사용할 수 있는 문자는 사용하는 운영체제 마다 다르며, #과 같이 웹에서 사용하기 적절하지 않은 문자가 포함될 수 있기 때문에 적절히 인코딩을 합니다. 업로드된 파일의 내용을 읽어오기 위해서는 바이트 수를 알아야하기 때문에 ContentLength 속성을 사용합니다. Image 타입으로 저장하기 위해서는 바이트 배열이어야 하므로 바이트 배열로 데이터를 읽어옵니다. 나머지는 ADO.NET에서 저장 프로시저를 사용해서 데이터를 저장하는 과정입니다.
최신 콘텐츠