* .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'에서 사용하는 방법은 다른 글에서 다루도록 하겠습니다.