程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 用asp.net2.0在數據庫中存儲二進制文件(一)

用asp.net2.0在數據庫中存儲二進制文件(一)

編輯:.NET實例教程

一、 引言

  在構建數據驅動的應用程序時,經常需要捕獲文本和二進制數據。這樣的程序可能需要存儲圖像,PDF,Word文件或其它二進制數據。能夠使用兩種方式來存儲這些二進制數據:存儲在web服務器的文件系統上並添加一個對數據庫中相應文件的引用;或直接存儲在數據庫本身。

   文本數據,例如字符串,數字,日期,GUID,貨幣值,等等-在數據庫系統中都有適當的和相應的數據類型定義。例如,在Microsoft SQL Server中,你可以使用int數據類型來存儲一個整數值;而為了存儲一個字符串值,你可以使用一個varchar或nvarchar類型。另外,數據 庫還提供了用於存儲二進制數據的類型定義。在Microsoft SQL SERVER 2000及早期版本中,使用image數據類型來存儲二進制數據;而在SQL Server 2005中,使用varbinary(MAX)數據類型。使用上面兩種方式中的任何一種,這些數據類型都能夠存儲可達2GB大小的二進制數據。

   不過,當直接把二進制數據存儲在數據庫時,需要增加一些額外工作來實現插入、更新和檢索二進制數據。幸好,我們可以通過更高級的數據存取庫-例如 ADO.NET-對這種復雜的低級T-SQL操作加以抽象,從而使問題變得相當簡單。然而,通過ADO.NET方式使用二進制數據與使用文本數據的確有點 不同。在本文中,我們將分析如何使用ADO.NET和ASP.Net 2.0 SqlDataSource控件直接通過一個數據庫來存儲和檢索圖像文件。請接著往下閱讀!

  二、 把數據存儲在數據庫中與存儲在文件系統中的比較

   正如剛才介紹的,當捕獲一個應用程序中的二進制數據時,該二進制數據既可以直接存儲在數據庫中也可以作為一個文件保存在web服務器的文件系統中-僅保 持一個對數據庫中文件的引用。根據我的體驗,我發現大多數開發者更喜歡在文件系統中存儲二進制數據,這主要基於下列原因:

  · 需要較少的工作-存儲和檢索存儲在數據庫中的二進制需要更多的編碼工作。而且,更新這些二進制數據也會更為容易-不需要與數據庫通訊,只須直接修改文件即可!

   · 指向文件的URL更為直接-正如我們將在本文中所看到的,為了提供存取存儲在一個數據庫中的二進制數據,我們需要創建另一個能夠返回該數據的 ASP.Net頁面。典型地,會把相應於數據庫中對應記錄(返回它的二進制數據)的一個唯一的標識符傳遞給這個頁面。結果是,為了存取該二進制數據-比方 說一個上傳的圖像-該URL看上去如http://www.yourserver.com/ShowImage.ASPx?ID=4352的形式,而如果 該圖像直接存儲在文件系統中,URL將更為直接些-例如http: //www.yourserver.com/UploadedImages/Sam.jpg。

  · 為顯示圖像提供更好的工具支持-如果你在使用ASP.Net 2.0,那麼,你可以在GridView或DetailsView控件中使用ImageFIEld控件來顯示一個圖像(它的圖像路徑存儲在數據庫中)。然 而,遺憾的是,這個ImageFIEld卻無法直接顯示數據庫中的圖像數據(既然它要求查詢一個外部頁面並且返回相應的數據)。

  · 性能-既然二進制文件存儲在web服務器的文件系統而不是存儲在數據庫中,那麼,應用程序可以訪問數據庫中較少的數據,從而減少了對數據庫的要求,也相應地減少了存在於web和數據庫服務器之間的網絡擁擠。

  把數據直接存儲在數據庫的主要優點在於,它能夠使數據成為"自包含的"。既然所有的數據都包含在數據庫中,那麼,數據支持、數據在數據庫服務器間的移動以及數據庫復制等等就容易得多了,因為不存在擔心復制或備份存儲在文件系統中的二進制內容這樣的問題。

   如往常一樣,至於選擇哪種存儲方案要具體依賴於實際的使用場所和業務需要。例如,我開發過一個客戶端,其中的二進制數據必須存儲在數據庫中,因為它們使 用的報告軟件僅能夠在報告中包括二進制數據-如果它來自於數據庫的話。在另一種情況下,我的一個同事在開發一個工程,其中的二進制文件需要為web應用程 序使用並且可經由FTP使用,這種情況很有必要把二進制數據存儲在文件系統中。

  三、 創建一個存儲二進制數據的數據庫表格

  本文中的其它部分將分析一個簡單的ASP.Net2.0圖像畫廊應用程序,我使用微軟SQL Server 2005 Express Edition編寫的,用於展示本文所闡述的直接從一個數據庫中存儲和檢索二進制數據的相關概念。

   這個圖像畫廊應用程序的數據模型包括一個表格-Pictures,其中的每一個記錄對應畫廊中的一幅圖片。這個Pictures表格的MIMEType 域中存儲了上載圖像(對於JPG文件是image/jpeg,對於GIF文件是image/gif,等等)的MIME類型;這裡的MIME類型向浏覽器指 定如何生成該二進制數據。其中的ImageData列則存儲了該圖片實際的二進制內容。
  四、 上傳一個圖像並使用ADO.Net代碼存儲二進制數據

  這個圖像畫廊允許訪問者上傳圖片文件(GIF, JPG和PNG格式)到這個應用程序中。一旦上傳,一個新的記錄將被添加到Pictures表格並且該圖像文件的內容即被存儲在新的記錄的 ImageData列內。為了實現在ASP.Net 2.0中把文件從web浏覽器端上傳到web服務器,本示例中使用了FileUpload控件。FileUpload控件的使用方法是很簡單的事情-只需 要把它從工具欄拖動到你的頁面上即可。最終,這個FileUpload控件將在用戶的浏覽器端生成為標准的文件上傳形式-一個"Browse"按鈕(當點 擊它時)允許用戶從他們的硬盤中選擇一個文件上傳到web服務器。

  例如,為了創建一個接口以實現添加一個新的圖像,我使用一個TextBox控件來捕獲圖片的標題,還有一個FileUpload控件用於允許用戶指定要上傳的圖像:

<b>Title:</b>
<ASP:TextBox ID="PictureTitle" runat="server" />
<br />
<b>Picture:</b>
<ASP:FileUpload ID="UploadedFile" runat="server" />
<br />
<ASP:LinkButton ID="btnInsert" runat="server" Text="Insert" />
<ASP:LinkButton ID="btnCancel" runat="server" Text="Cancel" /> 

  上面的代碼創建一個頁面,用戶能夠從他們的硬盤上指定一個要上傳到web服務器的文件。

一旦用戶選擇了一個文件並且寄送了這個表單(例如通過點擊"Insert"按鈕),那麼,指定文件的二進制內容即被寄送到web服務器。從服務器端代碼 中,這種二進制數據通過FileUpload控件的PostedFile.InputStream屬性成為可用,這正如下面的標記和代碼所展示的:

Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert.Click
'確保一個文件被成功上傳
If UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream Is Nothing Then
 ... 顯示錯誤信息...
 Exit Sub
End If
'確保我們在操作一個JPG或者GIF文件
Dim extension As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = Nothing
Select Case extension
 Case ".gif"
  MIMEType = "image/gif"
 Case ".jpg", ".jpeg", ".jpe"
  MIMEType = "image/jpeg"
 Case ".png"
  MIMEType = "image/png"
 Case Else
  '無效的文件類型上傳
  ... 顯示錯誤信息...
  Exit Sub
End Select

'與數據庫連接並且把一條新記錄插入到Products表格中
Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)

Const SQL As String = "INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)"
Dim myCommand As New SqlCommand(SQL, myConnection)
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)

'把FileUpload控件的InputStream加載到字節數組中
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) As Byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
 myCommand.Parameters.AddWithValue("@ImageData", imageBytes)
 myConnection.Open()
 myCommand.ExecuteNonQuery()
 myConnection.Close()
End Using
End Sub 

  在此,這個事件處理器首先確保已經上傳一個文件。然後,它根據被上傳的文件的擴展名來決定MIME類型。

  上面最值得注意 的是那些設置@ImageData參數的代碼部分。首先,創建一個名為imageBytes的字節數組並且使其長度為被上傳的文件相應的 InputStream。然後,從InputStream中使用Read方法把二進制內容填入這個字節數組。注意,正是這個字節數組被指定為 @ImageData的值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved