2012. 11. 6. 15:00

* .Net 4.0 기준 *

 

다른 DB도 가능합니다만 DB에 이진데이터를 저장할 수 있습니다.

흔gl 이진데이터는 'byte' 타입이고 DB에 저장할 때는 'binary' 타입으로 저장합니다.

 

웹에서는 특별한 이유가 없으면 DB에 파일을 저장하지 않습니다.

파일 크기보다 더 큰 용량을 사용하기 때문이죠. (최적화 문제도....)

대신 폴더권한 같은 것들을 지정하지 않아도 DB 권한만 가지고 파일을 업로드하고 다운로드할 수 있고 외부에서 접근도 힘들어서 보안상으로도 좋습니다.

 

 

1. 파일 업로드 컨트롤

'ASP.NET'에서 업로드할 파일을 지정할 때 많이 사용하는 컨트롤이 'FileUpload'입니다.

이 컨트롤을 디자인에 추가해 봅시다.

파일을 지정하고 업로드 요청을 보낼 버튼도 만들어 줍니다.

 

 

2. DB 처리 클래스

DB 처리 클래스야 제가 말 안 해도 알아서 잘 작성하시겠죠?

 

2-1. 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

 

 

2-2. DB 처리 클래스 작성

이런 류의 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;
	}
}

 

 

3. 업로드 버튼 구현

버튼의 비하인드를 다음과 같이 작성 합니다.

파일을 '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'으로 변환하면 업로드가 가능합니다.

 

 

3. 테스트

이제 돌려 봅시다.

 

'ImageData'는 DB에서 'Image' 타입으로 지정되어 있고

'byteData'는 DB에서 'varbinary(max)'로 지정되어 있습니다.

 

양쪽 다 'byte'가 잘 들어가는 것으로 보아 거의 같은 동작을 하는 것으로 판단되네요.

 

 

마무리

간단하게 'MSSQL'에 파일을 저장하는 방법을 알아보았습니다.

이렇게 올린 파일을 응용프로그램이나 'ASP.NET'에서 사용하는 방법은 다른 글에서 다루도록 하겠습니다.