基于ASP NET实现图片存储数据库及页面读取研究与应用.docx
- 文档编号:23039043
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:10
- 大小:20.06KB
基于ASP NET实现图片存储数据库及页面读取研究与应用.docx
《基于ASP NET实现图片存储数据库及页面读取研究与应用.docx》由会员分享,可在线阅读,更多相关《基于ASP NET实现图片存储数据库及页面读取研究与应用.docx(10页珍藏版)》请在冰豆网上搜索。
基于ASPNET实现图片存储数据库及页面读取研究与应用
基于ASP.NET实现图片存储数据库及页面读取研究与应用
摘要:
对于A中存储签名图片,做了一个详细解决方案。
完善了客服端碰到的在数据库存储一个签名图片所遇到的问题。
关键词:
ASP.NET;数据库;存储图片;SQLServe
0引言
随着计算机网络与信息技术的迅速发展,Web已经成为各类信息系统开发的主流平台,许多信息网站在发布信息时均采用基于数据库的动态信息发布系统。
基于ASP.NET技术进行图片的上传与下载,需要使用专门的ASP文件上传组件或ISAPI扩展程序,这限制了程序设计的灵活性。
同时由于图片属于复杂类型数据,在SQLServer数据库中与声音、大型电子表格等共用一个image字段类型,而且图片本身也有不同的数据格式,如.Gif或.Jpg,无法用操作一般字段的方法进行存取。
针对这一实际问题,本文介绍了基于ASP.NET实现Web图片存取的新方法,通过利用ASP.NET中的上传文件对HttpPostedFile、ADO.NETStream对象及ADO、NET提供的经过优化的SQLServer对象集,使Web信息中的图片上传到服务器并存入后台数据库,以及从数据库读取图片并在网页上显示更为简捷高效。
采用开发环境为ASP.NET+SQL2000数据库。
1图片的处理方式
对于图片的处理有两种方式:
①图片数据以文件形式直接存储在硬盘,在数据库中保存该图片的记录附加信息(路径、文件名、注释);②图片直接存储在数据库中。
这两种方式各有利弊。
图片文件存入数据库中便于管理与维护,而存入硬盘可能会因为不小心删除图片文件,而使得数据不一致,但图片放在数据库中不便于修改编辑,同时会引起数据库读取数据时的I/O消耗,而放在硬盘上则不会引起这个问题。
所以对于小文件,建议放在数据库中便于管理,而对于大文件,不可放在数据库中,否则数据库表会大量产生数据文件的碎片。
图1ASP.NET系统结构模型
2图片存储方法
该系统使用ASP.NET和SQLServer数据库实现图片的存储。
将图片存放到硬盘指定的目录下,将图片的相对存储路径和其它附属信息存储到数据库中。
开发平台使用的语言为VB,数据库访问技术为ADO.NET,数据访问机制采用的是ADO.NET里的OleDb机制。
3数据库表设计
3.1存储图片ImageStore表数据库设计
create table StoreImage
{
id int not null identity(1,1) primary key,
markname varchar(100) not null,--图片备注名称
markContent image not null,--文件内容
markType varchar(100) not null,--保存文件类型 用于生成
markSize int not null,--图片长度 读取数据用
markLinkUrl varchar(1000) not null,--数据库路径
markDate datetime not null default( getdate())--上传时间
}
go
其中在表设计中添加了上传图片文件类型和文件大小(Byte字节大小),主要为了读取时对图片显示进行控制,存储图片内容采用Image类型,SQL2005数据容量为2G,对应C#中类型Byte(字节数组),其中在设计中参考使用SQL中Binary类型,但是测试后发现Binary类型容量范围1~8000字节,对于图片容量太小,markLinkUrl测试以图片路径方式存储并读取显示在页面的方式。
3.2后台数据库的配置
图片管理系统使用SQLServer2000数据库,代码如下:
ImportSystem.Data.OleDb
PublicClassconn
InheritsSystem.Web.UI.Page
/定义一个数据库连接
PublicconnAsOleDbConnection=NewOleDbConnection("Provider=
SQLOLEDB;DataSouce=(local);InitialCatalog=pic;User=sa;Pwd=sa")
EndClass
3.3图片存储到数据库并读取
图片存储:
通过文件上传获取图片并转换成Byte[]字节数组,保存到数据库Image字段,页面设计如下代码:
<script language="javascript" type="text/javascript">
function checkClint()
{
var getmarkname=document.getElementById("markname");
var getfile=document.getElementById("FileUpload1");
if(getmarkname.value=="")
{
alert('请输入图片备注名称!
');
getmarkname.focus();
return false;}else if(getfile.value=="")
{
alert('请选择上传文件路径!
');
getfile.focus();
return false;
}else
{
return true;
}
}
</script>
在页面Form表单添加了一个属性,在页面Form中设置属性enctype设置或获取表单的mime编码。
3.4单一保存文件到数据库通用方法
通用方法写在Button1_Click事件中--命名没有修改,通用方法如下代码:
protected void Button1_Click(object sender, EventArgs e)
{
//获取数据
string getname = this.markname.Text;
string getfile = this.FileUpload1.PostedFile.FileName;
//上传文件
string getlastpath = FileUploadCompant(this.FileUpload1);
//获取上传文件流
byte[] getbyte=new byte[this.FileUpload1.PostedFile.ContentLength];
Stream filestream = this.FileUpload1.PostedFile.InputStream;
//读入数据
filestream.Read(getbyte, 0, this.FileUpload1.PostedFile.ContentLength);
//插入数据
#region
Stringsql="insert into StoreImage(markname,markContent,markType,markSize,markLinkUrl) values(@name,@content,@type,@size,@link)";
SqlParameter[] getpars = new SqlParameter[5];
getpars[0] = new SqlParameter("@name", getname);
getpars[1] = new SqlParameter("@content", getbyte);//文件内容插入This.Fileupload1.FileBytes同样可以直接转换成Byte数组,不用转换
getpars[2] = new SqlParameter("@type",
this.FileUpload1.PostedFile.ContentType);//保存文件类型
getpars[3] = new SqlParameter("@size",
this.FileUpload1.PostedFile.ContentLength);//文件长度
getpars[4] = new SqlParameter("@link", getlastpath);
int getrescount=
DBUtility.SqlHelper.ExecuteNonQuery(DBUtility.SqlHelper.connString,CommandType.Text,sql,getpars);
if (getrescount=1)
{
//添加成功
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "aler ", "alert( '图片记录成功添加到数据库'); ", true);
}
else
{
//添加失败
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "aler ", "alert( '图片记录添加失败'); ", true);
}
#endregion
}
这种获得图片转换成Byte[]字节数组通用,其中在Fileupload控件中有个GetBytes属性,This.Fileupload1.FileBytes可以直接把上传内容转换成字节数组而不必通过文件流来读取上传文件内容,这种方式更为快捷;如上图片成功保存到数据库,只需解决如何读取和显示控制的问题。
4数据库存储图片的读取和显示控制
从数据库中读取到字节流后把图片直接写入页面并对显示进行控制。
读取方法如下:
protected void Button2_Click(object sender, EventArgs e)
{
//获得数据
string sql = "select * from StoreImage order by id desc";
#region
using (SqlDataReader getreader =
DBUtility.SqlHelper.ExecuteReader(DBUtility.SqlHelper.connString, CommandType.Text, sql))
{
if (getreader !
= null&&getreader.HasRows)
{
//读取数据
while (getreader.Read()){
Response.ContentType = getreader["markType"] as string;
Response.OutputStream.Write(getreader["markContent"] as byte[], 0,
Convert.ToInt32(getreader["markSize"].ToString()));
Response.End();
}
}
}
#endregion
}
数据库中MarkType字段用来设置请求回发页面内容类型,获得字节流后把回发内容转换成输出流然后输出到当前页面,当然也可以直接使用Response.BinaryWrite()写入页面,图片自动显示,把它显示在页面一个Image控件中或是放到一个DIV层中。
这就是在实际需求对读取图片进行显示控制问题。
制作过验证码图片应该知道,验证码生成图片单独放在一个页面,然后通过Image控件的ImageUrl来链接该页面,即可实现在Image控件控制,同理这种方式也适用添加了一个页面用来存储生成图片,详细代码如下(OutPutImageDemo页面后台编码):
//PageLoad事件中加载图片并显示到OutPutImageDemo页面
protected void Page_Load(object sender, EventArgs e)
{
if (!
IsPostBack)
{
//获得数据
string sql = "select * from StoreImage order by id desc";
#region
using (SqlDataReader getreader=
DBUtility.SqlHelper.ExecuteReader(DBUtility.SqlHelper.connString, CommandType.Text, sql))
{
if (getreader!
=null && getreader.HasRows)
{
//读取数据
while (getreader.Read())
{
Response.ContentType = getreader["markType"] as string;
Response.OutputStream.Write(getreader["markContent"] as byte[], 0,
Convert.ToInt32(getreader["markSize"].ToString()));
Response.End();
}
}
}
#endregion
}
}
在TestImageStoreToDB.aspx页面一个控件中获取该图片,只需设置图片的链接路径即可,直接在数据库存储图片因资源图片较多,图片文件较大,类似银行内部系统中对VIP用户签名就是用签名图片方式存储的。
这主要是为了安全上考虑,实际需求中使用次数频繁且常常更新,无疑这样会使数据库中数据显得有些臃肿,数据容量增大,同时也增加了访问数据库服务器的负载,而使用存储图片路径的方式:
图片文件放在服务器硬盘上,数据库中只需一个文件路径指向硬盘上图片文件即可。
存储方式相比存储字节流要简单,容易控制,但是在网上发现关于这种页面显示的诸多问题。
下面说明A对图片页面显示控制,数据库中存储路径为绝对路径,现在页面放一个服务器端的Image控件和Html中的<img/>来验证。
如果直接用绝对路径对控件进行赋值,页面并不显示,其实这就涉及到.net中绝对路径、相对路径和虚拟路径三者之间转换的问题。
绝对路径是不行的,在硬盘上存储文件命名是唯一的,同时不会存在不同的文件格式相同的命名情况,过滤绝对路径,从绝对路径就能看出图片的存储位置就在根目录FileuploadDict文件夹下,只需把这个绝对路径转换成程序可用相对路径即可:
同时用服务器端的Image控件和Html测试一下,可以得到满意的结果。
5结语
随着SQLServer数据库管理系统功能的不断增强、性能不断完善,将各类数据完全由数据库管理系统统一存储和管理已成为可能。
只有利用数据库对各种数据进行管理,数据的安全性才能得到充分的保障,并使得诸如数据检索、复制、备份等工作变得非常简单。
一个好的解决方案能够使系统具有更大的适用性。
如果将图片直接存储到数据库中,由于图片数据不断增加,数据库就会不断变大,而将图片数据以文件形式直接存储到硬盘,在数据库中保存该图片的记录附加信息(路径、文件名、注释),就会使数据库存储的信息相对减少,从而提高数据库的访问性能。
参考文献:
[1]VINCENTL.Morphologicalgrayscalereconstructioninimageanalysis:
Applicationsandefficientalgorithms[J].IEEETransactionsonImageProcessing,1993
(2).
[2]冒东奎,冒小慧.用ASP存取数据库的图形[J].计算机应用,2002
(2).
[3]郑晓菊.基于ASP.NET实现图片的存取[J].五邑大学学报:
自然科学版,2005(4).
[4]刘晓艳.数据库中图像存储的策略与方法研究[J].科技情报开发与经济,2005(10).
[5]张俊兰.李源平.基于SQLServer的A图片存储技术[J].电子设计工程,2009(3).
[6]DINOESPOSITO.精通ASP.NET程序设计[M].北京:
清华大学出版社,2006.
[7]叶汶华,程永灵.ASP.NET网页制作教程[M].北京:
冶金工业出版社,2004.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于ASP NET实现图片存储数据库及页面读取研究与应用 基于 ASP NET 实现 图片 存储 数据库 页面 读取 研究 应用