asp.Netファイルをデータベースにアップロードするソリューション

5940 ワード

次に、ファイルを格納するデータベース・テーブル構造を見てみましょう.ここでは、テーブルを構築するための標準的なSQL文を示します.

CREATE TABLE tblBooksUpload
(
 DocID int NOT NULL IDENTITY Primary Key ,
 DocTitle varchar (200) ,
 Doc image,
 DocType varchar (50) ,
 Entrydate datetime Default GetDate()
)

上記の文では、データテーブルtblBooksUploadには5つのフィールドが含まれています.
・フィールドDocIDはテーブルのキーフィールド、データレコード番号である.
・フィールドDocTitleは、アップロードファイルを簡単に説明するためのもので、テキストファイルをアップロードする場合は、一般的にファイルタイトル、画像、プログラムなどに設定し、画像、プログラムの簡単な紹介に設定します.
・フィールドDocは、アップロードしたファイルを格納するためのフィールドであり、ここではDocフィールドの設定をImageカテゴリとする.
・フィールドDocTypeは私たちがアップロードしたファイルのタイプを保存するために使用されていますが、なぜこのフィールドが必要なのか不思議かもしれません.実は、このフィールドはとても重要で、ユーザーがデータベースからデータを取得する時、このフィールドはデータフィールドDocの中のデータのカテゴリを指定するために使用して、それから、ブラウザはこのフィールドによってユーザーに提示するデータを決定します;
・フィールドDateTimeは、サーバの現在の日付から取得された時間フィールドです.
次に、データを挿入するストレージ・プロシージャを示します.具体的なコードを見てみましょう.

CREATE PROCEDURE uSP_BooksUploadFile
@Title varchar(200),
@Doc image,
@DocType varchar(4)

AS

INSERT tblBooksUpload(DocTitle,Doc,DocType)
VALUES (@Title,@Doc,@DocType)

GO

まず、クライアントからアップロードされたファイルを取得し、データストリームに入れます.第二に、サーバ側はデータストリームを読み出し、キャッシュに保存する.第三に、キャッシュデータをデータベースに保存する.
次に、これらの機能をプログラムでどのように実現するかを一歩一歩見てみましょう.最初のステップはもちろん、まずユーザーがブラウザ側で自由にファイルを選択し、アップロードすることを実現します.ここではユーザーがファイルを選択し、もちろん標準的なWindows方式が必要です.だから、ここではFormのFileファイルコンポーネントを使用してユーザーにファイルを選択します.ファイルをアップロードするため、Formのプロパティ設定時にmultipart/form-dataに設定すると、ファイルを正しくアップロードできます.次は、ページをアップロードする主なコードです.

<form id="frmUpload" method="post" enctype="multipart/form-data" runat="server">
<span>Title</span><br>
<asp:textbox id="txtTitle" runat="server" EnableViewState="False"></asp:textbox>
<asp:requiredfieldvalidator id="valrTitle" runat="server" ErrorMessage="* 
Required" ControlToValidate="txtTitle">* Required</asp:requiredfieldvalidator>

<br>
<br>

<span>Docutment to Upload</span><br>
<input id="txtFileContents" type="file" runat="server" NAME="txtFileContents">
<br>
<br>

<asp:button id="btnSubmit" Text="Submit" Runat="server"></asp:button>
</form>

ステップ2
アップロードしたファイルをデータストリームでキャッシュに保存できます.キャッシュのサイズはファイルのサイズと同じです.以下のコードを使用してファイルのサイズを取得できます.

int intDocLen = txtFileContents.PostedFile.ContentLength;

次に、キャッシュの具体的なサイズを設定できます.

byte[] Docbuffer = new byte[intDoclen];

これにより、アップロードされたファイルの内容をキャッシュに保存できます.

Stream objStream;
objStream = txtFileContents.PostedFile.InputStream;
objStream.Read(Docbuffer,0,intDocLen);

以上のコードでは、キャッシュを読み込むときに、キャッシュの0位置からファイル全体の長さまで、これがファイル全体またはキャッシュ全体のサイズです.
ステップ3
キャッシュデータをデータベースに保存する必要があります.データテーブル構造まで保存することで、簡単なSQL文を書くことでこの機能を実現できます.上記では、SqlCommandオブジェクトを作成し、このストレージ・プロシージャを渡し、「@Doc」パラメータを設定してキャッシュ・データを取得すればよいストレージ・プロシージャを作成しました.

cmdUploadDoc = new SqlCommand("uSP_BooksUploadFile",BooksConn);
cmdUploadDoc.CommandType = CommandType.StoredProcedure;
cmdUploadDoc.Parameters.Add("@Title ",SqlDbType.VarChar,200);
cmdUploadDoc.Parameters.Add("@Doc",SqlDbType.Image);
cmdUploadDoc.Parameters.Add("@DocType",SqlDbType.VarChar,4);

cmdUploadDoc.Parameters[0].Value = txtTitle.Text;
cmdUploadDoc.Parameters[1].Value = Docbuffer;
cmdUploadDoc.Parameters[2].Value = strDocType;

クリックボタン処理コード

private void btnSubmit_Click(object sender, System.EventArgs e)
{
 string strDocExt;
 //strDocType           
 string strDocType;

 //        

 int intDocLen;

 //Stream        

 Stream objStream;
 SqlConnection BooksConn; 
 SqlCommand cmdUploadDoc;

 if(IsValid)
 {
  if(txtFileContents.PostedFile != null)
  {
   //    
   strDocExt = CString.Right(txtFileContents.PostedFile.FileName,4).ToLower();
   switch(strDocExt)
   {
    case ".doc":
     strDocType = "doc";
     break;
    case ".ppt":
     strDocType = "ppt";
     break;
    case ".htm":
     strDocType = "htm";
     break;
    case ".html":
     strDocType = "htm";
     break;
    case ".jpg":
     strDocType = "jpg";
     break;
    case ".gif":
     strDocType = "gif";
     break;
    default:
     strDocType = "txt";
     break;
   }
   //        
   intDocLen = txtFileContents.PostedFile.ContentLength;
   byte[] Docbuffer = new byte[intDocLen];
   objStream = txtFileContents.PostedFile.InputStream;

   //        
   //         

   objStream.Read(Docbuffer ,0,intDocLen);
   BooksConn = new SqlConnection("Server=Server;UID=sa;Database=Books");
   cmdUploadDoc = new SqlCommand("uSP_BooksUploadFile",BooksConn);
   cmdUploadDoc.CommandType = CommandType.StoredProcedure;
   cmdUploadDoc.Parameters.Add("@Title ",SqlDbType.VarChar,200);
   cmdUploadDoc.Parameters.Add("@Doc",SqlDbType.Image);
   cmdUploadDoc.Parameters.Add("@DocType",SqlDbType.VarChar,4);
   cmdUploadDoc.Parameters[0].Value = txtTitle.Text;
   cmdUploadDoc.Parameters[1].Value = Docbuffer ;
   cmdUploadDoc.Parameters[2].Value = strDocType;
   BooksConn.Open();
   cmdUploadDoc.ExecuteNonQuery();
   BooksConn.Close();
  }
 }
}

以上述べた方法をまとめると、すべてのタイプのファイルに適しており、上記のコードを適切に修正することで、データベースに完全に基づいたファイル管理システムを構築することができます.