在ASP.NET中把图片保存到SQL SERVER数据库

在 ASP.NET 中把图片保存到 SQL SERVER 数据库

翻译:吕绍伟

介绍

在很多情况下,我们需要把图片保存到数据库中。在某些应用程序中,存在一些敏感信息不能被存储到文件系统中,因为存储在文件系统上的任何图片都很容易被用户非法获得。

本文将讨论在 ASP.NET 中怎样把图片保存到 SQL SERVER 数据库中。

在本文中我们将了解到以下几方面的内容:

l 上载图片文件的要求

l 使用 Strem 对象

l 获得上载图片大小和类型

l 如何使用 InputStream 方法?

上载图片文件的要求

在开始上载前我们需要作两件重要的事情

#Form 标记的 enctype 属性需要被设置为如下形式:

enctype="multipart/form-data"

提供一个让用户选择图片文件的 Html 控件:

1<input type="file"/>

还要引用 System.IO 命名空间来处理 Strem 对象

上述的三项都要应用到 aspx 页中。在 SQL SERVER 中还有以下的一些要求:

一个至少有一个字段类型为 Image 的表

另外有一个用来存储图片类型的 Varchar 类型的字段就更好了

那么,我们有了一个有 Image 字段类型的数据表和一个

1<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文件,只要你打开这些文件就可以知道怎样适当的修改。初次翻译,还望大家多多指正。 **

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