熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET中上傳文件到數據庫

2013-11-13 12:21:24  來源: .NET編程 
  介紹

  為什麼要將文件保存到數據庫呢?理由很多最直接的就是將文件放入數據庫以後可以對文件進行更好的管理特別是文本文件圖片等如果不使用數據庫數量巨大的時候很難做到有效的管理和區別特別是需要作一些與文字密切相關的應用的時候將文件全部放入數據庫是最好的選擇對文字的處理檢索等都可以直接利用數據庫的一些功能可以做到真正的有效管理本文舉例主要針對以文字為基礎的文件比如WORD等但是實際上對程序稍微修改就可以上傳所有文件類型

  數據表結構

  現在我們來看存放文件的數據庫表結構這裡我們給出建立表的標准SQL語句

  CREATE TABLE tblBooksUpload

  (

  DocID int NOT NULL IDENTITY Primary Key

  DocTitle varchar ()

  Doc image

  DocType varchar ()

  Entrydate datetime Default GetDate()

  )

  以上的語句中我們看到數據表tblBooksUpload包含五個字段

  字段DocID是表的關鍵字段數據記錄編號

  字段DocTitle是用來簡單說明上傳文件的如果上傳文本文件我們一般將其設置為文件標題圖像程序等就設置為圖像程序的簡單介紹

  字段Doc是用來存放我們上傳的文件的字段注意這裡將Doc字段的設置為Image類別

  字段DocType用來保存我們上傳文件的類型可能我們奇怪為什麼要這個字段呢?其實這個字段是很重要的在用戶從數據庫取得數據的時候這個字段將用來指定數據字段Doc中數據的類別然後浏覽器根據這個字段來決定呈現給用戶的數據

  字段DateTime是一個時間字段我們可以看到該字段的值取自服務器的當前日期

  下面是插入數據的存儲過程我們來看具體代碼

   CREATE TABLE tblBooksUpload

  (

  DocID int NOT NULL IDENTITY Primary Key

  DocTitle varchar ()

  Doc image

  DocType varchar ()

  Entrydate datetime Default GetDate()

  )

  上傳文件的步驟

  現在我們先從文字上了解一下上傳文件到數據庫的具體步驟再從代碼上來實現

  首先從客戶端取得上傳的文件然後我們將它放入數據流

  第二服務器端讀取數據流然後將其保存到緩存

  第三將緩存數據保存到數據庫

  現在我們一步步來看怎樣在程序中實現這些功能

  第一步

  當然首先我們要實現用戶在浏覽器端自由選擇文件然後上傳這裡用戶選擇文件當然是要求標准的Windows方式所以我們在這裡使用Form的File文件組件來給用戶選擇文件注意因為上傳文件所以在Form的屬性設置的時候我們應該設置為multipart/formdata這樣才可以正確上傳文件

下面是上傳頁面的主要代碼

  <form id=frmUpload method=post enctype=multipart/formdata 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>

  第二步

  我們可以將上傳的文件通過數據流保存到緩存緩存的大小和文件的具體大小相同我們可以使用以下的代碼來取得文件的具體大小

  int intDocLen = txtFileContentsPostedFileContentLength;

  然後我們可以設置緩存的具體大小了

  byte[] Docbuffer = new byte[intDoclen];

  這樣設置以後我們可以將上傳文件的內容保存到緩存中

  Stream objStream;

  objStream = txtFileContentsPostedFileInputStream;

  objStreamRead(DocbufferintDocLen);

  在以上代碼中讀取緩存的時候從緩存的位置開始直到整個文件的長度其實這就是整個文件或者整個緩存的大小

  第三步

  現在我們需要做的就是將緩存數據保存到數據庫我們已經直到數據表結構這樣我們通過編寫簡單的SQL語句就可以實現這個功能在上面的內容中我們編寫了一個存儲過程在程序中我們只要建立SqlCommand對象並且將這個存儲過程傳遞給它並設置@Doc參數取得緩存數據就可以了

  cmdUploadDoc = new SqlCommand(uSP_BooksUploadFileBooksConn);

  cmdUploadDocCommandType = CommandTypeStoredProcedure;

  cmdUploadDocParametersAdd(@Title SqlDbTypeVarChar);

  cmdUploadDocParametersAdd(@DocSqlDbTypeImage);

  cmdUploadDocParametersAdd(@DocTypeSqlDbTypeVarChar);

  cmdUploadDocParameters[]Value = txtTitleText;

  cmdUploadDocParameters[]Value = Docbuffer;

  cmdUploadDocParameters[]Value = strDocType;

  點擊按鈕處理代碼

  private void btnSubmit_Click(object sender SystemEventArgs e)

  {

  string strDocExt;

  //strDocType用於保存上傳文件的類型

  string strDocType;

  //用於保存文件大小

  int intDocLen;

  //Stream用於讀取上傳數據

  Stream objStream;

  SqlConnection BooksConn;

  SqlCommand cmdUploadDoc;

  if(IsValid)

  {

  if(txtFileContentsPostedFile != null)

  {

  //文件類型

  strDocExt = CStringRight

  (txtFileContentsPostedFileFileName)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 = txtFileContentsPostedFileContentLength;

  byte[] Docbuffer = new byte[intDocLen];

  objStream = txtFileContentsPostedFileInputStream;

  //文件保存到緩存

  //緩存將保存到數據庫

  objStreamRead(Docbuffer intDocLen);

  BooksConn = new

  SqlConnection(Server=Server;UID=sa;Database=Books);

  cmdUploadDoc = new

  SqlCommand(uSP_BooksUploadFileBooksConn);

  cmdUploadDocCommandType = CommandTypeStoredProcedure;

  cmdUploadDocParametersAdd(@Title SqlDbTypeVarChar);

  cmdUploadDocParametersAdd(@DocSqlDbTypeImage);

  cmdUploadDocParametersAdd(@DocTypeSqlDbTypeVarChar);

  cmdUploadDocParameters[]Value = txtTitleText;

  cmdUploadDocParameters[]Value = Docbuffer ;

  cmdUploadDocParameters[]Value = strDocType;

  BooksConnOpen();

  cmdUploadDocExecuteNonQuery();

  BooksConnClose();

  }

  }

  }

  總結

  以上我們提到的方法適合所有類型的文件對以上代碼作適當修改我們就可以建立一個完全基於數據庫的文件管理系統


From:http://tw.wingwit.com/Article/program/net/201311/15736.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.