介紹
在很多情況下,我們需要把圖片保存到數據庫中。在某些應用程序中,存在一些敏感信息不能被存儲到文件系統中,因爲存儲在文件系統上的任何圖片都很容易被用戶非法獲得。
本文將討論在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事件代碼
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數據庫。
例子的輸出樣例
圖:將圖片保存到sql server 數據庫
測試下面的代碼
代碼下載
總結
這樣,我們完成了怎樣把圖片保存到數據庫的討論。我們也準備好了使用上面的下載部分提供的例子和存儲過程。如果你想知道怎樣從SQL SERVER中讀取圖片,請參閱我的這篇文章Retrieving Images from SqlServer in ASP .NET
譯者注:由於受到HTTP傳輸協議的限制,在不同的環境下能夠上載文件的大小不一。對於要上傳大文件的WEB應用程序來說,這並不是一個完美的解決方案,只是爲我們提供了一種相對較好的方法。我曾經用這種方法在局域網中成功上載30M的文件,但是在系統性能較低的另外一個本機系統中,最多隻能上載5M的數據。另外需要讀者注意的是,上載大文件的時候要適當修改machine.config和web.config文件,只要你打開這些文件就可以知道怎樣適當的修改。初次翻譯,還望大家多多指正。