ASP.Net 圖片存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
更新時(shí)間:2008年11月26日 12:21:10 作者:
在很多時(shí)候,我們有這樣的需求:把圖片存入到數(shù)據(jù)庫(kù)當(dāng)中。在一些應(yīng)用程序中,我們可能有一些敏感的資料,由于存儲(chǔ)在文件系統(tǒng)(file system)中的東西,將很容易被某些用戶盜取,所以這些數(shù)據(jù)不能存放在文件系統(tǒng)中。
在這篇文章中,我們將討論怎樣把圖片存入到Sql2000當(dāng)中。
在這篇文章中我們可以學(xué)到以下幾個(gè)方面的知識(shí):
1. 插入圖片的必要條件
2. 使用流對(duì)象
3. 查找準(zhǔn)備上傳的圖片的大小和類型
4.怎么使用InputStream方法?
插入圖片的必要條件
在我們開(kāi)始上傳之前,有兩件重要的事我們需要做:
#Form 標(biāo)記的 enctype 屬性應(yīng)該設(shè)置成 enctype="multipart/form-data"
# 需要一個(gè)<input type=file>表單來(lái)使用戶選擇他們要上傳的文件,同時(shí)我們需要導(dǎo)入 System.IO名稱空間來(lái)處理流對(duì)象
把以上三點(diǎn)應(yīng)用到aspx頁(yè)面。同時(shí)我們需要對(duì)SqlServer做以下的準(zhǔn)備。
# 需要至少含有一個(gè)圖片類型的字段的表
# 如果我們還有另外一個(gè)變字符類型的字段來(lái)存儲(chǔ)圖片類型,那樣會(huì)更好一些。
現(xiàn)在,我們準(zhǔn)備了一個(gè)Sql表(包含了一個(gè)image數(shù)據(jù)類型的字段),還有<input type=file>標(biāo)記。當(dāng)然我們還得準(zhǔn)備Submit按鈕,以便用戶在選擇了圖片以后提交。在這個(gè)按鈕的Onclick事件里,我們需要讀取選取圖片的內(nèi)容,然后把它存入到表里。那我們先來(lái)看看這個(gè)Onclick事件。
提交按鈕的Onclick事件的代碼:
以下為引用的內(nèi)容:
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控件的對(duì)象。首先需要獲得圖片的大小,可以使用下面的代碼實(shí)現(xiàn):
intImageSize = PersonImage.PostedFile.ContentLength
然后返回圖片的類型使用ContenType屬性。最后,也是最重要的事就是取得Image Stream,這可以用以下代碼實(shí)現(xiàn):
ImageStream = PersonImage.PostedFile.InputStream
我們需要一個(gè)字節(jié)型數(shù)組來(lái)存儲(chǔ)image 內(nèi)容。讀取整個(gè)圖片可以使用Stream對(duì)象的Read方法來(lái)實(shí)現(xiàn)。Read(in byte[] buffer,int offset,int count)方法有三個(gè)參數(shù)。【關(guān)于Read方法的詳細(xì)可以參看.Net FrameWorkSDK】他們是:
buffer
字節(jié)數(shù)組。此方法返回時(shí),該緩沖區(qū)包含指定的字符數(shù)組,該數(shù)組的 offset 和 (offset + count) 之間的值由從當(dāng)前源中讀取的字節(jié)替換。
offset
buffer 中的從零開(kāi)始的字節(jié)偏移量,從此處開(kāi)始存儲(chǔ)從當(dāng)前流中讀取的數(shù)據(jù)。
count
要從當(dāng)前流中最多讀取的字節(jié)數(shù)。
這個(gè)Read方法用以下代碼實(shí)現(xiàn):
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
現(xiàn)在,我們已經(jīng)讀取了整個(gè)圖片的內(nèi)容,下一步,我們要把這些內(nèi)容存入到sql 表。我們將使用存儲(chǔ)過(guò)程來(lái)完成插入圖片類型和圖片內(nèi)容到sql 表。如果你瀏覽了上面的代碼,你將會(huì)發(fā)現(xiàn)我們使用了sqldbtype.image的數(shù)據(jù)類型(datatype)。Ok了,完成了這些,我們也就成功的把圖片存入到SqlServer中了。下面是我們編寫(xiě)的aspx頁(yè)面。
圖片存入數(shù)據(jù)庫(kù)結(jié)論
我們已經(jīng)討論了如何把圖片存入到Sql Server,那么我們?nèi)绾螐腟qlServer中讀取圖片呢?可以參看我的另一篇文章:在Asp.Net中從SqlServer中檢索圖片。
在這篇文章中我們可以學(xué)到以下幾個(gè)方面的知識(shí):
1. 插入圖片的必要條件
2. 使用流對(duì)象
3. 查找準(zhǔn)備上傳的圖片的大小和類型
4.怎么使用InputStream方法?
插入圖片的必要條件
在我們開(kāi)始上傳之前,有兩件重要的事我們需要做:
#Form 標(biāo)記的 enctype 屬性應(yīng)該設(shè)置成 enctype="multipart/form-data"
# 需要一個(gè)<input type=file>表單來(lái)使用戶選擇他們要上傳的文件,同時(shí)我們需要導(dǎo)入 System.IO名稱空間來(lái)處理流對(duì)象
把以上三點(diǎn)應(yīng)用到aspx頁(yè)面。同時(shí)我們需要對(duì)SqlServer做以下的準(zhǔn)備。
# 需要至少含有一個(gè)圖片類型的字段的表
# 如果我們還有另外一個(gè)變字符類型的字段來(lái)存儲(chǔ)圖片類型,那樣會(huì)更好一些。
現(xiàn)在,我們準(zhǔn)備了一個(gè)Sql表(包含了一個(gè)image數(shù)據(jù)類型的字段),還有<input type=file>標(biāo)記。當(dāng)然我們還得準(zhǔn)備Submit按鈕,以便用戶在選擇了圖片以后提交。在這個(gè)按鈕的Onclick事件里,我們需要讀取選取圖片的內(nèi)容,然后把它存入到表里。那我們先來(lái)看看這個(gè)Onclick事件。
提交按鈕的Onclick事件的代碼:
以下為引用的內(nèi)容:
復(fù)制代碼 代碼如下:
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控件的對(duì)象。首先需要獲得圖片的大小,可以使用下面的代碼實(shí)現(xiàn):
intImageSize = PersonImage.PostedFile.ContentLength
然后返回圖片的類型使用ContenType屬性。最后,也是最重要的事就是取得Image Stream,這可以用以下代碼實(shí)現(xiàn):
ImageStream = PersonImage.PostedFile.InputStream
我們需要一個(gè)字節(jié)型數(shù)組來(lái)存儲(chǔ)image 內(nèi)容。讀取整個(gè)圖片可以使用Stream對(duì)象的Read方法來(lái)實(shí)現(xiàn)。Read(in byte[] buffer,int offset,int count)方法有三個(gè)參數(shù)。【關(guān)于Read方法的詳細(xì)可以參看.Net FrameWorkSDK】他們是:
buffer
字節(jié)數(shù)組。此方法返回時(shí),該緩沖區(qū)包含指定的字符數(shù)組,該數(shù)組的 offset 和 (offset + count) 之間的值由從當(dāng)前源中讀取的字節(jié)替換。
offset
buffer 中的從零開(kāi)始的字節(jié)偏移量,從此處開(kāi)始存儲(chǔ)從當(dāng)前流中讀取的數(shù)據(jù)。
count
要從當(dāng)前流中最多讀取的字節(jié)數(shù)。
這個(gè)Read方法用以下代碼實(shí)現(xiàn):
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
現(xiàn)在,我們已經(jīng)讀取了整個(gè)圖片的內(nèi)容,下一步,我們要把這些內(nèi)容存入到sql 表。我們將使用存儲(chǔ)過(guò)程來(lái)完成插入圖片類型和圖片內(nèi)容到sql 表。如果你瀏覽了上面的代碼,你將會(huì)發(fā)現(xiàn)我們使用了sqldbtype.image的數(shù)據(jù)類型(datatype)。Ok了,完成了這些,我們也就成功的把圖片存入到SqlServer中了。下面是我們編寫(xiě)的aspx頁(yè)面。
圖片存入數(shù)據(jù)庫(kù)結(jié)論
我們已經(jīng)討論了如何把圖片存入到Sql Server,那么我們?nèi)绾螐腟qlServer中讀取圖片呢?可以參看我的另一篇文章:在Asp.Net中從SqlServer中檢索圖片。
您可能感興趣的文章:
- Asp.net把圖片存入數(shù)據(jù)庫(kù)和讀取圖片的方法
- asp.net 將一個(gè)圖片以二進(jìn)制值的形式存入Xml文件中的實(shí)例代碼
- asp.net創(chuàng)建位圖生成驗(yàn)證圖片類(驗(yàn)證碼類)
- asp.net圖片上傳實(shí)例
- ASP.net WebAPI 上傳圖片實(shí)例
- ASP.NET連接SQL數(shù)據(jù)庫(kù)的簡(jiǎn)單實(shí)例代碼
- ASP.NET 連接ACCESS數(shù)據(jù)庫(kù)的簡(jiǎn)單方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- ASP.NET實(shí)現(xiàn)圖片以二進(jìn)制的形式存入數(shù)據(jù)庫(kù)
相關(guān)文章
GridView分頁(yè)的實(shí)現(xiàn)以及自定義分頁(yè)樣式功能實(shí)例
本文為大家詳細(xì)介紹下GridView實(shí)現(xiàn)分頁(yè)并自定義的分頁(yè)樣式,具體示例代碼如下,有想學(xué)習(xí)的朋友可以參考下哈,希望對(duì)大家有所幫助2013-07-07GridView多層嵌套和折疊與展開(kāi)(修改適合自己使用)
這個(gè)功能的GridView多層嵌套沒(méi)有問(wèn)題,因?yàn)橐呀?jīng)做了無(wú)限次數(shù),但是折疊與展開(kāi)的功能,卻花上不少時(shí)間(網(wǎng)上找資料),雖找到資料可參考,還是了解明它,并修改適合自己程序使用,感興趣的朋友可以了解下2013-01-01Asp.Net其他頁(yè)面如何調(diào)用Web用戶控件寫(xiě)的分頁(yè)
這篇文章主要介紹了Asp.Net其他頁(yè)面如何調(diào)用Web用戶控件寫(xiě)的分頁(yè),需要的朋友可以參考下2014-05-05asp.net后臺(tái)彈窗如何實(shí)現(xiàn)
這篇文章主要介紹了asp.net后臺(tái)彈窗如何實(shí)現(xiàn),需要的朋友可以參考下2014-02-02ASP.NET頁(yè)面優(yōu)化 性能提升8倍的方法
今天與大家分享:一種優(yōu)化頁(yè)面執(zhí)行速度的方法。采用這個(gè)方法,可以使用頁(yè)面的執(zhí)行速度獲得【8倍】的提升效果2012-03-03ASP.NET檢測(cè)到不安全 Request.Form 值解決方案匯總
這篇文章主要介紹了ASP.NET檢測(cè)到不安全 Request.Form 值解決方案匯總 ,十分的全面,需要的朋友可以參考下2015-06-06