明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

在ASP.NET中把圖片保存到SQL SERVER數(shù)據(jù)庫(kù)

[摘要]介紹 在很多情況下,我們需要把圖片保存到數(shù)據(jù)庫(kù)中。在某些應(yīng)用程序中,存在一些敏感信息不能被存儲(chǔ)到文件系統(tǒng)中,因?yàn)榇鎯?chǔ)在文件系統(tǒng)上的任何圖片都很容易被用戶非法獲得。 本文將討論在ASP.NET中怎樣把圖片保存到SQL SERVER數(shù)據(jù)庫(kù)中。 在本文中我們將了解到以下幾方面的內(nèi)容: l????????...

介紹
在很多情況下,我們需要把圖片保存到數(shù)據(jù)庫(kù)中。在某些應(yīng)用程序中,存在一些敏感信息不能被存儲(chǔ)到文件系統(tǒng)中,因?yàn)榇鎯?chǔ)在文件系統(tǒng)上的任何圖片都很容易被用戶非法獲得。

本文將討論在ASP.NET中怎樣把圖片保存到SQL SERVER數(shù)據(jù)庫(kù)中。

在本文中我們將了解到以下幾方面的內(nèi)容:

l???????? 上載圖片文件的要求

l???????? 使用Strem對(duì)象

l???????? 獲得上載圖片大小和類型

l???????? 如何使用InputStream方法?

上載圖片文件的要求

在開(kāi)始上載前我們需要作兩件重要的事情

#Form標(biāo)記的enctype屬性需要被設(shè)置為如下形式:

enctype="multipart/form-data"

#提供一個(gè)讓用戶選擇圖片文件的Html控件:



#還要引用System.IO命名空間來(lái)處理Strem對(duì)象

上述的三項(xiàng)都要應(yīng)用到aspx頁(yè)中。在SQL SERVER中還有以下的一些要求:

#一個(gè)至少有一個(gè)字段類型為Image的表

#另外有一個(gè)用來(lái)存儲(chǔ)圖片類型的Varchar類型的字段就更好了

那么,我們有了一個(gè)有Image字段類型的數(shù)據(jù)表和一個(gè)(HTML文件控件)。我們還需要一個(gè)提交按鈕,當(dāng)用戶選擇好圖片后可以點(diǎn)擊它。在按鈕的OnClick事件中我們要獲得圖片文件的內(nèi)容并最終把它插入到數(shù)據(jù)表中。讓我們來(lái)看看按鈕的OnClick事件,它讀取圖片并把圖片插入到數(shù)據(jù)表中。

提交按鈕的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

?

它是如何工作的?

對(duì)象PersonImage 是HTMLInputFile 控件。首先我們要獲得被插入圖片的大小,通過(guò)如下方法實(shí)現(xiàn):

intImageSize = PersonImage.PostedFile.ContentLength

接著要通過(guò)ContenType屬性獲得圖片類型。最后最重要的是要獲得圖片文件流,通過(guò)如下方法實(shí)現(xiàn):

ImageStream = PersonImage.PostedFile.InputStream

我們有一個(gè)byte數(shù)組ImageContent,準(zhǔn)備用來(lái)保存圖片內(nèi)容。整個(gè)圖片通過(guò)Stream對(duì)象的Read方法讀取,這個(gè)方法有三個(gè)參數(shù),即:

#被復(fù)制的圖片內(nèi)容的目標(biāo)位置

#讀的開(kāi)始位置

#需要被讀的子節(jié)數(shù)

讀聲明如下:

intStatus = ImageStream.Read(ImageContent, 0, intImageSize)

現(xiàn)在,我們讀取了整個(gè)圖片內(nèi)容。接著我們需要把圖片內(nèi)容插入SQL數(shù)據(jù)表中,我們將用用一個(gè)存儲(chǔ)過(guò)程把圖片類型和圖片插入SQL數(shù)據(jù)表。如果你看過(guò)上面的代碼清單,你就知道我們把數(shù)據(jù)類型設(shè)置為SqlDbType.Image.就這樣,我們成功地把圖片保存到了SQL SERVER數(shù)據(jù)庫(kù)。

例子的輸出樣例



圖:將圖片保存到sql server 數(shù)據(jù)庫(kù)

測(cè)試下面的代碼

代碼下載

點(diǎn)擊這里下載ASPX頁(yè)

點(diǎn)擊這里下載存儲(chǔ)過(guò)程

總結(jié)

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

譯者注:由于受到HTTP傳輸協(xié)議的限制,在不同的環(huán)境下能夠上載文件的大小不一。對(duì)于要上傳大文件的WEB應(yīng)用程序來(lái)說(shuō),這并不是一個(gè)完美的解決方案,只是為我們提供了一種相對(duì)較好的方法。我曾經(jīng)用這種方法在局域網(wǎng)中成功上載30M的文件,但是在系統(tǒng)性能較低的另外一個(gè)本機(jī)系統(tǒng)中,最多只能上載5M的數(shù)據(jù)。另外需要讀者注意的是,上載大文件的時(shí)候要適當(dāng)修改machine.config和web.config文件,只要你打開(kāi)這些文件就可以知道怎樣適當(dāng)?shù)男薷。初次翻譯,還望大家多多指正。