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

原创 2004年09月14日 10:17:00

翻译:吕绍伟(转载)

介绍

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

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

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

l上载图片文件的要求

l 使用Strem对象

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

l 如何使用InputStream方法?

上载图片文件的要求

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

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

enctype="multipart/form-data" <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

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

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

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

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

那么,我们有了一个有Image字段类型的数据表和一个(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文件,只要你打开这些文件就可以知道怎样适当的修改。初次翻译,还望大家多多指正。

SQL Server 用触发器实现库存的先进先出(有退货)

限制: 1)进仓表、出仓表只能一次插入一条,多条触发器没有对应。 2)退货没有指定批次,是按最近原则自动匹配的。...
  • tiger_zhao
  • tiger_zhao
  • 2015年05月04日 15:02
  • 1476

C++使用ADO存取图片

 在项目中,我们需要把事故简图上传到总服务器,以便每个客户端都能下载或者查看。在网上找了找,向Server2000存储图片代码比较多,从数据库中读取图片并显示也不少,但是把图片从数据库中二进制数...
  • eit520
  • eit520
  • 2014年06月10日 16:01
  • 3098

sql server数据库保存图片或者其他小文件

测试用sql server数据库保存图片或者其他小文件。 文件流字段用varbinary类型。 static void Main() { ...
  • pukuimin1226
  • pukuimin1226
  • 2013年12月26日 14:28
  • 8671

从TXT文本文档向Sql Server中批量导入数据

因为工作的需要,近期在做数据的分析和数据的迁移。在做数据迁移的时候需要将原有的数据导入到新建的数据库中。本来这个单纯的数据导入导出是没有什么问题的,但是客户原有的数据全部都是存在.dat文件中的。所以...
  • xuemoyao
  • xuemoyao
  • 2013年01月15日 16:30
  • 21508

SQLServer 从xml 文件中提取节点数据到数据库中

0 1 (240,240) AA 1/2 BPSK 设计 1 2 (240,192) kk 1/2 QPSK 人格 ...
  • kk185800961
  • kk185800961
  • 2013年10月06日 17:21
  • 4284

大数据量下的SQL Server数据库自身优化

原文: http://www.d1net.com/bigdata/news/284983.html 1.1:增加次数据文件          从SQL SERVER 2005开始,数据库不...
  • ren6370
  • ren6370
  • 2017年06月25日 18:47
  • 262

sql server 2008如何导入mdf,ldf文件

如何将mdf, ldf 文件导入到sql server 2008数据库当中,下面提供两种办法: 第一种是右击数据库,然后点击附加。出现下面的界面。然后选择添加,添加上你要添加的mdf文件即可。   第...
  • zhanghongjie0302
  • zhanghongjie0302
  • 2013年08月10日 21:38
  • 14514

在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 ...
  • yupeigu
  • yupeigu
  • 2016年01月13日 14:37
  • 719

SQL Server表中数据导出为多个Excel文件和TXT文件

SQL Server表中数据按条件批量导出为多个Excel文件是本文我们主要要介绍的内容,在一次SQL Server数据库的操作中,需要将某个有数十万行数据的表按类别导出为xls文件,每个类别一个xl...
  • u012968272
  • u012968272
  • 2015年05月01日 13:12
  • 1259

VC在Sql Server数据库中如何存取二进制图片信息

转载地址:VC在Sql Server数据库中如何存取二进制图片信息  http://blog.hehehehehe.cn/a/1396.htm 在VC6.0中我们通常用Ado的Field 对象的Ge...
  • lijun5635
  • lijun5635
  • 2016年06月23日 09:13
  • 1096
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在ASP.NET中把图片保存到SQL SERVER数据库
举报原因:
原因补充:

(最多只允许输入30个字)