介紹在很多情況下,我們需要把圖片儲存到資料庫中。在某些應用程式中,存在一些敏感資訊不能儲存到檔案系統中,因為儲存在檔案系統上的任何圖片都很容易被使用者非法取得。
本文將討論在ASP.NET中如何將圖片保存到SQL SERVER資料庫中。
在本文中我們將了解以下幾方面的內容:
l 上載圖片檔的要求
l 使用Strem對象
l 獲得上載圖片大小和類型
l 如何使用InputStream方法?
上載圖片檔案的要求在開始上載前我們需要做兩件重要的事情
#Form標記的enctype屬性需要被設定為如下形式:
enctype="multipart/form-data"
#提供一個讓使用者選擇圖片檔案的Html控制:
<input type=file>
#還要引用System.IO命名空間來處理Strem物件上述的三項都要應用到aspx頁。在SQL SERVER中還有以下的一些要求:
#一個至少有一個欄位類型為Image的表
#另外有一個用來儲存圖片類型的Varchar類型的欄位就更好了那麼,我們有了一個有Image欄位類型的資料表和一個<input type=file>(HTML檔案控制項)。我們還需要一個提交按鈕,當用戶選擇好圖片後可以點擊它。在按鈕的OnClick事件中我們要獲得圖片檔案的內容並最終把它插入到資料表中。讓我們來看看按鈕的OnClick事件,它讀取圖片並將圖片插入到資料表中。
提交按鈕的OnClick事件程式碼
http://blog.downcodes.com/
Dim intImageSize As Int64
Dim strImageType As String
Dim ImageStream As Stream
' Gets the Size of the Image
intImageSize = PersonImage.PostedFile.ContentLength
' Gets the Image Type
strImageType = PersonImage.PostedFile.ContentType
' Reads the Image
ImageStream = PersonImage.PostedFile.InputStream
Dim ImageContent(intImageSize) As Byte
Dim intStatus As Integer
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
' Create Instance of Connection and Command Object
Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
Dim myCommand As New SqlCommand("sp_person_isp", myConnection)
' Mark the Command as a SPROC
myCommand.CommandType = CommandType.StoredProcedure
' Add Parameters to SPROC
Dim prmPersonImage As New SqlParameter("@PersonImage", SqlDbType.Image)
prmPersonImage.Value = ImageContent
myCommand.Parameters.Add(prmPersonImage)
Dim prmPersonImageType As New SqlParameter("@PersonImageType", SqlDbType.VarChar, 255)
prmPersonImageType.Value = strImageType
myCommand.Parameters.Add(prmPersonImageType)
Try
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
Response.Write("New person successfully added!")
Catch SQLexc As SqlException
Response.Write("Insert Failed. Error Details are: " & SQLexc.ToString())
End Try
它是如何運作的?
物件PersonImage 是HTMLInputFile 控制項。首先我們要獲得被插入圖片的大小,透過以下方法實現:
intImageSize = PersonImage.PostedFile.ContentLength
接著要透過ContenType屬性取得圖片類型。最後最重要的是要獲得圖片檔案流,透過以下方法實現:
ImageStream = PersonImage.PostedFile.InputStream
我們有一個byte數組ImageContent,準備用來保存圖片內容。整個圖片透過Stream物件的Read方法讀取,這個方法有三個參數,分別是:
#被複製的圖片內容的目標位置
#讀的開始位置
#需要被讀的子節數讀聲明如下:
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
現在,我們讀取了整個圖片內容。接著我們需要把圖片內容插入SQL資料表中,我們將用一個預存程序把圖片類型和圖片插入SQL資料表。如果你看過上面的程式碼清單,你就知道我們把資料類型設定為SqlDbType.Image.就這樣,我們成功地把圖片儲存到了SQL SERVER資料庫。