如何在ASP.Net 中把图片存入数据库

介绍

可能有很多的时候,我们急需把图片存入到数据库当中。在一些应用程序中,我们可能有一些敏感的资料,由于存储在文件系统( file system ) 中的东西,将很容易被某些用户盗取,所以这些数据不能存放在文件系统中。

在这篇文章中,我们将讨论怎样把图片存入到 Sql2000 当中。

在这篇文章中我们可以学到以下几个方面的知识:

1. 插入图片的必要条件

2. 使用流对象

3. 查找准备上传的图片的大小和类型

4.怎么使用 InputStream 方法?

插入图片的必要条件

在我们开始上传之前,有两件重要的事我们需要做:

# Form 标记的 enctype 属性应该设置成 enctype="multipart/form-data"

需要一个

1<input type="file"/>

表单来使用户选择他们要上传的文件,同时我们需要导入 System.IO 名称空间来处理流对象

把以上三点应用到 aspx 页面。同时我们需要对 SqlServer 做以下的准备。

# 需要至少含有一个图片类型的字段的表

# 如果我们还有另外一个变字符类型的字段来存储图片类型,那样会更好一些。

现在,我们准备了一个 Sql表(包含了一个image数据类型的字段),还有

1<input type="file"/>

标记。当然我们还得准备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 中检索图片。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus