1. 程式人生 > >如何在ASP.Net 中把圖片存入資料庫

如何在ASP.Net 中把圖片存入資料庫

介紹

   可能有很多的時候,我們急需把圖片存入到資料庫當中。在一些應用程式中,我們可能有一些敏感的資料,由於儲存在檔案系統(file system)中的東西,將很容易被某些使用者盜取,所以這些資料不能存放在檔案系統中。

  在這篇文章中,我們將討論怎樣把圖片存入到Sql2000當中。

  在這篇文章中我們可以學到以下幾個方面的知識:

1.     插入圖片的必要條件

2.     使用流物件

3. 查詢準備上傳的圖片的大小和型別

4.怎麼使用InputStream方法?

插入圖片的必要條件

在我們開始上傳之前,有兩件重要的事我們需要做:

#Form 標記的 enctype 屬性應該設定成 enctype="multipart/form-data"

# 需要一個表單來使使用者選擇他們要上傳的檔案,同時我們需要匯入 System.IO名稱空間來處理流物件

把以上三點應用到aspx頁面。同時我們需要對SqlServer做以下的準備。

# 需要至少含有一個圖片型別的欄位的表

# 如果我們還有另外一個變字元型別的欄位來儲存圖片型別,那樣會更好一些。

現在,我們準備了一個Sql表(包含了一個image資料型別的欄位),還有標記。當然我們還得準備Submit按鈕,以便使用者在選擇了圖片以後提交。在這個按鈕的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屬性。最後,也是最重要的事就是取得Image Stream,這可以用以下程式碼實現:

ImageStream = PersonImage.PostedFile.InputStream

我們需要一個位元組型陣列來儲存image 內容。讀取整個圖片可以使用Stream物件的Read方法來實現。Read(in byte[] buffer,int offset,int count)方法有三個引數。【關於Read方法的詳細可以參看.Net FrameWorkSDK】他們是:

buffer

位元組陣列。此方法返回時,該緩衝區包含指定的字元陣列,該陣列的 offset 和 (offset + count) 之間的值由從當前源中讀取的位元組替換。

offset

buffer 中的從零開始的位元組偏移量,從此處開始儲存從當前流中讀取的資料。

count

要從當前流中最多讀取的位元組數。

這個Read方法用以下程式碼實現:
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
.

現在,我們已經讀取了整個圖片的內容,下一步,我們要把這些內容存入到sql 表。我們將使用儲存過程來完成插入圖片型別和圖片內容到sql 表。如果你瀏覽了上面的程式碼,你將會發現我們使用了sqldbtype.image的資料型別(datatype)。Ok了,完成了這些,我們也就成功的把圖片存入到SqlServer中了。下面是我們編寫的aspx頁面。

結論

我們已經討論瞭如何把圖片存入到Sql Server,那麼我們如何從SqlServer中讀取圖片呢?可以參看另一篇文章:在Asp.Net中從SqlServer中檢索圖片。