* .Net 4.0 기준 *
다른 DB도 가능합니다만 DB에 이진데이터를 저장할 수 있습니다.
흔gl 이진데이터는 'byte' 타입이고 DB에 저장할 때는 'binary' 타입으로 저장합니다.
웹에서는 특별한 이유가 없으면 DB에 파일을 저장하지 않습니다.
파일 크기보다 더 큰 용량을 사용하기 때문이죠. (최적화 문제도....)
대신 폴더권한 같은 것들을 지정하지 않아도 DB 권한만 가지고 파일을 업로드하고 다운로드할 수 있고 외부에서 접근도 힘들어서 보안상으로도 좋습니다.
'ASP.NET'에서 업로드할 파일을 지정할 때 많이 사용하는 컨트롤이 'FileUpload'입니다.
이 컨트롤을 디자인에 추가해 봅시다.
파일을 지정하고 업로드 요청을 보낼 버튼도 만들어 줍니다.
DB 처리 클래스야 제가 말 안 해도 알아서 잘 작성하시겠죠?
테이블 구성이라던가 하는 부분은 알아서 하실 정도는 되셔야 이 글이 의미가 있습니다 ㅎㅎㅎㅎ
CREATE PROCEDURE [dbo].[spImageView_Add] @imgDatas image, @imgByte varbinary(max) AS BEGIN SET NOCOUNT ON; Insert Into tb_ImageView_ImgData( ImageData, byteData) Values(@imgDatas, @imgByte); Return (Select @@IDENTITY); END
이런 류의 DB 클래스도 많이 작성해 보셨겠죠? ㅎㅎㅎ
public class dbImage { private SqlCommand m_msComm = null; private SqlConnection m_msConn = new SqlConnection("Server=[데이터 베이스 주소];DataBase=\"[데이터 베이스 이름]\";UId=\"[DB 로그인 아이디]\";pwd=\"[DB 비밀 번호]\""); /// /// 이미지를 업로드 합니다. /// /// /// 추가된 이미지의 DB인덱스 public int ImageUpload(byte[] byteData) { int nReturn = 0; m_msComm = new SqlCommand("spImageView_Add", m_msConn); m_msComm.CommandType = CommandType.StoredProcedure; //전달할 파라미터 m_msComm.Parameters.Add("@imgDatas", SqlDbType.Image).Value = byteData; m_msComm.Parameters.Add("@imgByte", SqlDbType.VarBinary).Value = byteData; //리턴용 파라메타 지정 m_msComm.Parameters.Add("@nReturn", SqlDbType.Int).Direction = ParameterDirection.ReturnValue; m_msConn.Open(); m_msComm.ExecuteNonQuery(); nReturn = Convert.ToInt32(m_msComm.Parameters["@nReturn"].Value); m_msConn.Close(); return nReturn; } }
버튼의 비하인드를 다음과 같이 작성 합니다.
파일을 'byte'로 변환하는 것 외에는 특별한 것은 없습니다.
protected void Button1_Click(object sender, EventArgs e) { //지정한 파일이 있냐? if (false == File.Exists(FileUpload1.PostedFile.FileName)) { //없다. //없으면 리턴 return; } //이상이 없구나! //이미지 임시 스크림 FileStream fsImg = null; try { //작설할 파일 오픈! fsImg = new FileStream(FileUpload1.PostedFile.FileName, FileMode.Open); //파일 정보 작성 FileInfo fiImg = new FileInfo(FileUpload1.PostedFile.FileName); int nFileLen = Convert.ToInt32(fiImg.Length); //byte로 변환 byte[] byteImg = new byte[nFileLen]; fsImg.Read(byteImg, 0, nFileLen); //DB에 전송 요청 m_insImg.ImageUpload(byteImg); } catch { } finally { //처리가 끝나던 에러가 나던 파일은 닫아 준다. fsImg.Close(); } }
일반적인 C#코드와 다를 게 없습니다.
어떤 파일이든 'FileStream'으로 변환하면 업로드가 가능합니다.
이제 돌려 봅시다.
'ImageData'는 DB에서 'Image' 타입으로 지정되어 있고
'byteData'는 DB에서 'varbinary(max)'로 지정되어 있습니다.
양쪽 다 'byte'가 잘 들어가는 것으로 보아 거의 같은 동작을 하는 것으로 판단되네요.
간단하게 'MSSQL'에 파일을 저장하는 방법을 알아보았습니다.
이렇게 올린 파일을 응용프로그램이나 'ASP.NET'에서 사용하는 방법은 다른 글에서 다루도록 하겠습니다.