[예제]Oracle BLOB 컬럼을 이용 binary로 파일을 DB에 저장
본 예제에서는 Excel 파일등을 바이너리로 오라클 서버의 BLOB로 올라가는 것을 테스트 했습니다.
본 예제는 제가 닷넷 개발자 과정을 강의 할때 UIT의 서주현 대리님께서 작성 하신 예제 입니다...
VS .NET에서 새 프로젝트 하나 만드시구요, C# --> 웹응용 프로그램 입니다.
----------------------------
1. Webform1.aspx
----------------------------
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="File.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server" enctype="multipart/form-data">
<input id="filMyFile" type="file" runat="server" NAME="filMyFile" style="WIDTH: 416px; HEIGHT: 22px"
size="50"><br>
<input type="submit" value="쿼리 전송">
</form>
</body>
</HTML>
----------------------------
2. Webform1.aspx.cs
----------------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using Oracle.DataAccess;
using Oracle.DataAccess.Types;
using Oracle.DataAccess.Client;
namespace File
{
/// <summary>
/// WebForm1에 대한 요약 설명입니다.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlInputFile filMyFile;
private void Page_Load(object sender, System.EventArgs e)
{
//HtmlInputFile 클래스에서 제공하는 프러퍼티중에서 PostedFile은
//업로드된 파일이 없다면 PostedFile은 null입니다.
//HttpPostedFile 개체는 다음과 같은 4개의 프로퍼티를 제공합니다.
//ContentLength : 업로드된 파일의 크기
//ContentType : 업로드된 파일의 MIME 타입(예 : image/gif)
//FileName : 클라이언트 컴퓨터 상에서의 업로드된 파일의 전체경로 (예 : c:tempMyPicture.gif)
//InputStream : 업로드된 데이터를 엑서스하기 위한 스트림 개체
if( filMyFile.PostedFile != null )
{
// HttpPostedFile 개체를 받아 옵니다.
HttpPostedFile myFile = filMyFile.PostedFile;
//파일 사이즈를 받아 옵니다.
int intFileLength = System.Convert.ToInt32(myFile.ContentLength);
// Ensure that there were contents to the file. Exit out of the function if there is no content.
if (intFileLength == 0)
{
return;
}
//파일 사이즈 만큼 바이트 배열을 잡는다.
byte[] myData = new byte[intFileLength];
//스트림에서 파일을 읽어 바이트 배열에 담자.
myFile.InputStream.Read(myData, 0, intFileLength);
//파일 생성
string strPath = @"C:\Temp" + Path.GetFileName(myFile.FileName);
FileStream newFile = new FileStream(strPath, FileMode.Create);
//byte 배열의 내용을 파일에 씁니다.
newFile.Write(myData, 0, myData.Length);
//파일을 닫습니다.
newFile.Close();
//Open our database connection to the table with the BLOB field
OracleConnection oConn = new OracleConnection("Data Source=UIT;User ID=system;Password=uit");
OracleDataAdapter oDA = new OracleDataAdapter("SELECT * FROM TC_FILES", oConn);
OracleCommandBuilder oCB = new OracleCommandBuilder(oDA);
DataSet ds = new DataSet();
DataRow dr;
// Fill the dataset with the schema but not the data
oDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
oConn.Open();
oDA.FillSchema(ds, SchemaType.Source, "TC_FILES");
// This may not be necessary
byte[] byteData = new byte[intFileLength];
myFile.InputStream.Read(byteData, 0, intFileLength);
// Create a new row to insert into the table
dr = ds.Tables["TC_FILES"].NewRow();
dr["FILE_ID"] = 1; // this should not be needed ... it's a sequence but will not allow nulls? so the 1 is a placeholder
dr["FILE_NAME"] = System.IO.Path.GetFileName(myFile.FileName);
dr["FILE_DATA"] = myData;
// Append the new row to the dataset
ds.Tables["TC_FILES"].Rows.Add(dr);
// Update the table using our dataset against our data adapter
oDA.Update(ds, "TC_FILES");
// Close our connection
oConn.Close();
//
// // Refresh the contents to the datagrid
// BindDataGrid(oConn, dgdFiles, "SELECT DOC_ID AS FILE_ID, FILENAME AS FILE_NAME, DBMS_LOB.GETLENGTH(DOCUMENT) AS FILE_SIZE FROM DOCUMENT FILES");
}
}
#region Web Form 디자이너에서 생성한 코드
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 이 호출은 ASP.NET Web Form 디자이너에 필요합니다.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
댓글 없음:
댓글 쓰기