在ASP.NET中把圖片保存到SQL SERVER數據庫

 

介紹

在很多情況下,我們需要把圖片保存到數據庫中。在某些應用程序中,存在一些敏感信息不能被存儲到文件系統中,因爲存儲在文件系統上的任何圖片都很容易被用戶非法獲得。

本文將討論在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 數據庫

測試下面的代碼

代碼下載

點擊這裏下載ASPX頁

點擊這裏下載存儲過程

總結

這樣,我們完成了怎樣把圖片保存到數據庫的討論。我們也準備好了使用上面的下載部分提供的例子和存儲過程。如果你想知道怎樣從SQL SERVER中讀取圖片,請參閱我的這篇文章Retrieving Images from SqlServer in ASP .NET

譯者注:由於受到HTTP傳輸協議的限制,在不同的環境下能夠上載文件的大小不一。對於要上傳大文件的WEB應用程序來說,這並不是一個完美的解決方案,只是爲我們提供了一種相對較好的方法。我曾經用這種方法在局域網中成功上載30M的文件,但是在系統性能較低的另外一個本機系統中,最多隻能上載5M的數據。另外需要讀者注意的是,上載大文件的時候要適當修改machine.config和web.config文件,只要你打開這些文件就可以知道怎樣適當的修改。初次翻譯,還望大家多多指正。

 

 

 

 

 

發佈了64 篇原創文章 · 獲贊 4 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章