上篇:图片存入到Sql Serversql
在不少时候,咱们有这样的需求:把图片存入到数据库当中。在一些应用程序中,咱们可能有一些敏感的资料,因为存储在文件系统(file system)中的东西,将很容易被某些用户盗取,因此这些数据不能存放在文件系统中。数据库
在这篇文章中,咱们将讨论怎样把图片存入到Sql2000当中。数组
在这篇文章中咱们能够学到如下几个方面的知识:浏览器
1. 插入图片的必要条件ide
2. 使用流对象oop
3. 查找准备上传的图片的大小和类型sqlserver
4.怎么使用InputStream方法?学习
ASP.NET数据库图片存储:插入图片的必要条件spa
在咱们开始上传以前,有两件重要的事咱们须要作:orm
#Form 标记的 enctype 属性应该设置成 enctype="multipart/form-data"
# 须要一个<input type=file>表单来使用户选择他们要上传的文件,同时咱们须要导入 System.IO名称空间来处理流对象
把以上三点应用到aspx页面。同时咱们须要对SqlServer作如下的准备。
# 须要至少含有一个图片类型的字段的表
# 若是咱们还有另一个变字符类型的字段来存储图片类型,那样会更好一些。
如今,咱们准备了一个Sql表(包含了一个image数据类型的字段),还有<input type=file>标记。固然咱们还得准备Submit按钮,以便用户在选择了图片之后提交。在这个按钮的Onclick事件里,咱们须要读取选取图片的内容,而后把它存入到表里。那咱们先来看看这个Onclick事件。
提交按钮的Onclick事件的代码:
这是怎么实现ASP.NET数据库图片存储的呢?
PersonImage是HTMLInputFile控件的对象。首先须要得到图片的大小,可使用下面的代码实现:
intImageSize = PersonImage.PostedFile.ContentLength
而后返回图片的类型使用ContenType属性。最后,也是最重要的事就是取得Image Stream,这能够用如下代码实现:
ImageStream = PersonImage.PostedFile.InputStream
咱们须要一个字节型数组来存储image 内容。读取整个图片可使用Stream对象的Read方法来实现。Read(in byte[] buffer,int offset,int count)方法有三个参数。他们是:
buffer
字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 offset 和 (offset + count) 之间的值由从当前源中读取的字节替换。
offset
buffer 中的从零开始的字节偏移量,今后处开始存储从当前流中读取的数据。
count
要从当前流中最多读取的字节数。
这个Read方法用如下代码实现:
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
.
如今,咱们已经读取了整个图片的内容,下一步,咱们要把这些内容存入到sql 表。咱们将使用存储过程来完成插入图片类型和图片内容到sql 表。若是你浏览了上面的代码,你将会发现咱们使用了sqldbtype.image的数据类型(datatype)。Ok了,完成了这些,咱们也就成功的把图片存入到SqlServer中了。
下面是咱们编写的aspx页面。
ASP.NET数据库图片存储:图片存入数据库结论
咱们已经讨论了如何把图片存入到Sql Server,那么咱们如何从SqlServer中读取图片呢?
下篇:从SqlServer中读取图片
这篇文章是我写的"如何把图片存入 sqlServer中"的后续。 和存储图片相比,读取图片就要简单多了。输出一副图片咱们要作的就是使用 Response对象的BinaryWrite方法。 同时设置图片的格式。在这篇文章中,咱们将讨论如何从SqlServer中检索图片。 并将学习如下几个方面的知识. ·如何设置图片的格式? ·如何使用BinaryWrite方法。 咱们已经在Person表中存储了数据,那么咱们就写些代码来从表中读取数据。 下面的代码检索了全部的值从Person表中。 从sqlserver中读取图片的代码. Public Sub Page_Load(sender As Object, e As EventArgs) Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString")) Dim myCommand As New SqlCommand("Select * from Person", myConnection) Try myConnection.Open() Dim myDataReader as SqlDataReader myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection) Do While (myDataReader.Read()) Response.ContentType = myDataReader.Item("PersonImageType") Response.BinaryWrite(myDataReader.Item("PersonImage")) Loop myConnection.Close() Response.Write("Person info successfully retrieved!") Catch SQLexc As SqlException Response.Write("Read Failed : " & SQLexc.ToString()) End Try End Sub 看看他是怎么工做的? 上面的例子很简单。咱们所做的就是执行一个sql语句,再循环读取全部的记录(looping through all the records). 在显示图片以前,咱们先设置了图片的contentType,而后咱们使用BinaryWrite方法把图片输出到浏览器。 源代码: /// retriving.aspx <%@ Page Language="vb" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <HTML> <HEAD> <title>Retrieving Image from the Sql Server</title> <script runat=server> Public Sub Page_Load(sender As Object, e As EventArgs) ' Create Instance of Connection and Command Object Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString")) Dim myCommand As New SqlCommand("Select * from Person", myConnection) Try myConnection.Open() Dim myDataReader as SqlDataReader myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection) Do While (myDataReader.Read()) Response.ContentType = myDataReader.Item("PersonImageType") Response.BinaryWrite(myDataReader.Item("PersonImage")) Loop myConnection.Close() Response.Write("Person info successfully retrieved!") Catch SQLexc As SqlException Response.Write("Read Failed : " & SQLexc.ToString()) End Try End Sub </script> </HEAD> <body style="font: 10pt verdana"> </body> </HTML>