【SQL开源代码栏目提醒】:网学会员--在 SQL开源代码编辑为广大网友搜集整理了:Asp_net中图片存储数据库以及页面读取显示通用方法详解-附源码下载 - chenkai - 博客园 - 开发文档绩等信息,祝愿广大网友取得需要的信息,参考学习。
Asp.net中图片存储数据库以及页面读取显示通用方法详解-附源码下载 - chenkai - 博客园分享到... 复制网址邮件QQ空间新浪微博MSN腾讯微博人人网开心网网易微博搜狐微博朋友网淘江湖猜你喜欢豆瓣一键分享查看更多120这是什么工具JiaThis 分享到各大网站 一键分享猜你喜欢复制网址收藏夹打印邮件QQ空间新浪微博腾讯微博搜狐微博网易微博人人网开心网搜狐白社会淘江湖豆瓣朋友网猫扑推客百度搜藏百度贴吧天涯社区飞信趣一网凤凰微博优士网饭否51社区谷歌谷歌Buzz有道书签QQ书签MSN新浪viviPinterest花瓣网堆糖粉丝网摇篮微博115收藏百度空间Gmail邮箱Hotmail邮箱Yahoo mail和讯南方微博139邮箱189邮箱手机天翼社区139说客人民微博中金微博财迷谷歌翻译推他麦库记事嘀咕网鲜果做啥赶牛网42区米聊我烧网新浪轻博凤凰快博中新网光明网人间网雷猴网和讯微博梦幻人生玛撒网人脉库FacebookTwitterTumblrRedditInstapaperRead It Later奇客发现若邻网别挑乐收同学网挖客网创业邦救救地球抽屉网递客网豆瓣9点美丽说蘑菇街天际网Poco网宝盒网易集网Pdf在线转换友好打印W3c验证Bit.lyDiggMail.ruDiigoEverNoteFriendFeedMyspaceLinkedInMixxNetLogNetvibesPhonefavsPing.fmPlaxoDeliciousMister WongStumbleuponPlurkFunpMyshareFwisp这是什么工具 JiaThis Spiga Posts - 195 Articles - 1 Comments - 1963 Cnblogs Dashboard Login Home Contact Gallery RSS 乱世经典 当一个人先从自己的内心开始奋斗他就是个有价值的人 Asp.net中图片存储数据库以及页面读取显示通用方法详解-附源码下载 2010-02-03 11:53 by chenkai 5308 visits 收藏 编辑 前端碰到对在一个系统遇到流程控制中需要存储在数据库存储一个签名图片的问题-一直控制不好 今天特别关于这个问题详细看了一下.其实这个问题网上资源还是相当多的但问题是过于凌乱 资料残缺不全 甚至我感觉其中有相当的一部分会对读者产生一些误导.对于Asp.net中存储图片我在08年一月份就做了一个详细解决方案今天在这个基础主要对一些细节控制上以及页面显示上做了完善详细步骤如下: 首先声明一下开发环境:VS2008
SQL2005数据库.NET FrameWork 3.5版本 1存储图片ImageStore表数据库设计: 1 create table StoreImage 2 3 id int not null identity11 primary key 4 markname varchar100 not null--图片备注名称 5 markContent image not null--文件内容 6 markType varchar100 not null--保存文件类型 用于生成 7 markSize int not null--图片长度 读取数据用 8 markLinkUrl varchar1000 not null--数据库路径 9 markDate datetime not null default getdate--上传时间 10 11 go 复制
代码 其中在表中设计中添加了上传图片文件类型和文件大小Byte字节大小主要为了读取时对图片显示进行控制.请参考后面编码说明.存储图片内容采用Image类型
SQL2005数据容量为2G对应C中类型Byte字节数组其中在设计中我还参考使用
SQL中Binary类型但是测试后发现Binary类型容量范围1-8000字节对于图片容量太小 markLinkUrl为了测试以图片路径方式存储并读取显示在页面这种方式 请参考后面详细说明. 2图片存储到数据库并单一读取: 图片存储:通过文件上传获取图片并转换成Byte字节数组保存到数据库Image字段页面设计如下:
代码 1 lt--说面这是全部的页面
代码:--gt 2 ltform idquotform1quot runatquotserverquot stylequotfont-size:12pxquot enctypequotmultipart/form-dataquotgt 3 4 备 注:ltasp:TextBox IDquotmarknamequot runatquotserverquotgtlt/asp:TextBoxgt 5 上 传:ltasp:FileUpload IDquotFileUpload1quot runatquotserverquot /gt 6 ltasp:Button IDquotButton1quot runatquotserverquot OnClientClickquotreturn checkClintquot Textquot上 传quot onclickquotButton1_Clickquot /gt 7 8 ltscript languagequotjavascriptquot typequottext/javascriptquotgt 9 function checkClint 10 11 var getmarknamedocument.getElementByIdquotmarknamequot 12 var getfiledocument.getElementByIdquotFileUpload1quot 13 14 ifgetmarkname.valuequotquot 15 16 alert请输入图片备注名称 17 getmarkname.focus 18 return false 19 else ifgetfile.valuequotquot 20 21 alert请选择上传文件路径 22 getfile.focus 23 return false 24 else 25 26 return true 27 28 29 lt/scriptgt 30 ampnbspampnbspampnbspampnbspampnbsp 31 ltasp:Button IDquotButton2quot runatquotserverquot onclickquotButton2_Clickquot Textquot读取图片quot /gt 32 33 ampnbspampnbspampnbspampnbspampnbspampnbsp 34 ltasp:Button IDquotButton3quot runatquotserverquot onclickquotButton3_Clickquot Textquot读取到Image控件中quot /gt 35 ampnbspampnbspampnbspampnbspampnbsp 36 ltasp:Button IDquotButton5quot runatquotserverquot onclickquotButton5_Clickquot Textquot存储链接方式获取图片quot /gt 37 ampnbspampnbspampnbspampnbspampnbspampnbspampnbsp 38 ltasp:Button IDquotButton4quot runatquotserverquot onclickquotButton4_Clickquot Textquot下载图片quot /gt 39 ltbr /gt 40 ltbr /gt 41 ltasp:Image IDquotImage1quot runatquotserverquot /gt 42 ltbr /gt 43 图片路径方式读取:ltbr /gt 44 服务器端:ltasp:Image IDquotImage2quot runatquotserverquot /gt 45 ltbr /gt 46 ltasp:Label IDquotLabel2quot runatquotserverquotgtlt/asp:Labelgt 47 ltbr /gt 48 客户端Img:ltimg altquotquot runatquotserverquot idquotclintimgquot /gt 49 ltbr /gt 50 ltasp:Label IDquotLabel1quot runatquotserverquotgtlt/asp:Labelgt 51 lt/formgt 在页面From表单添加了一个属性-在页面Form中设置属性enctype -设置或获取表单的 MIME 编码 单一保存文件到数据库通用方法【注明:通用方法写在Button1_Click事件中-命名没有修改主要为了功能】 通用方法如下:
代码 1 /// ltsummarygt 2 /// 上传文件同时并保存到数据中统一 3 /// Author:chenkai Date:2010年2月2日16:24:29 4 /// lt/summarygt 5 protected void Button1_Clickobject sender EventArgs e 6 7 //获取数据 8 string getname this.markname.Text 9 string getfile this.FileUpload1.PostedFile.FileName 10 11 //上传文件 12 string getlastpath FileUploadCompantthis.FileUpload1 13 14 //获取上传文件流 15 byte getbytenew bytethis.FileUpload1.PostedFile.ContentLength 16 Stream filestream this.FileUpload1.PostedFile.InputStream 17 18 //读入数据 19 filestream.Readgetbyte 0 this.FileUpload1.PostedFile.ContentLength 20 21 //插入数据 22 region 23 string
sql quotinsert into StoreImagemarknamemarkContentmarkTypemarkSizemarkLinkUrl valuesnamecontenttypesizelinkquot 24 25 SqlParameter getpars new SqlParameter5 26 getpars0 new SqlParameterquotnamequot getname 27 getpars1 new SqlParameterquotcontentquot getbyte//文件内容插入This.Fileupload1.FileBytes同样可以直接转换成Byte数组不用转换 28 getpars2 new SqlParameterquottypequot this.FileUpload1.PostedFile.ContentType//保存文件类型 29 getpars3 new SqlParameterquotsizequot this.FileUpload1.PostedFile.ContentLength//文件长度 30 getpars4 new SqlParameterquotlinkquot getlastpath 31 32 int getrescount DBUtility.SqlHelper.ExecuteNonQueryDBUtility.SqlHelper.connStringCommandType.Textsqlgetpars 33 34 if getrescount 1 35 36 //添加成功 37 ScriptManager.RegisterStartupScriptthis.Page this.GetType quotaler quot quotalert 图片记录成功添加到数据库 quot true 38 39 else 40 41 //添加失败 42 ScriptManager.RegisterStartupScriptthis.Page this.GetType quotaler quot quotalert 图片记录添加失败 quot true 43 44 45 endregion 46 这种获得图片转换成Byte【】字节数组通用注意:其中在Fileupload控件中有个GetBytes属性:This.Fileupload1.FileBytes可以直接把上传内容转换成字节数组而不必通过文件流来读取上传文件内容这种方式更为快捷如上图片成功保存到数据库 接下来就是如何读取和显示控制的问题: 3数据库存储图片的读取和显示控制: 从数据库中读取到字节流后把图片直接写入页面并对显示进行控制 读取方法如下【该方法下载Button2_Click中】:
代码 1 /// ltsummarygt 2 /// 读取数据库中图片并显示出来 3 /// Author:chenkai Date:2010年2月2日16:48:18 4 /// lt/summarygt 5 protected void Button2_Clickobject sender EventArgs e 6 7 //获得数据 8 string
sql quotselect from StoreImage order by id descquot 9 10 region 11 using SqlDataReader getreader DBUtility.SqlHelper.ExecuteReaderDBUtility.SqlHelper.connString CommandType.Text
sql 12 13 if getreader nullampampgetreader.HasRows 14 15 //读取数据 16 while getreader.Read 17 18 Response.ContentType getreaderquotmarkTypequot as string 19 Response.OutputStream.WritegetreaderquotmarkContentquot as byte 0 Convert.ToInt32getreaderquotmarkSizequot.ToString 20 Response.End 21 22 23 24 endregion 25 数据库中MarkType字段用来设置请求回发页面内容类型获得字节流后把回发内容转换成输出流然后输出到当前页面当然也可以直接使用Response.BinaryWrite写入页面图片自动显示.但是有人会说我想把它显示在页面一个Image控件中或是放到一个DIV层中这样实际需求. 这就是在实际需求对读取图片进行显示控制问题. 制作过验证码图片应该知道验证码生成图片单独放在一个页面让后通过Image控件的ImageUrl来链接该页面即可实现在Image控件控制同理这种方式也是适用的: -添加了一个页面用来存储生成图片详细
代码如下:OutPutImageDemo页面后台编码:
代码 1 //PageLoad事件中加载图片 并显示到OutPutImageDemo页面 2 //Author陈凯 Date:2010年2月3日10:28:17 3 protected void Page_Loadobject sender EventArgs e 4 5 if IsPostBack 6 7 //获得数据 8 string
sql quotselect from StoreImage order by id descquot 9 10 region 11 using SqlDataReader getreader DBUtility.SqlHelper.ExecuteReaderDBUtility.SqlHelper.connString CommandType.Text
sql 12 13 if getreader null ampamp getreader.HasRows 14 15 //读取数据 16 while getreader.Read 17 18 Response.ContentType getreaderquotmarkTypequot as string 19 Response.OutputStream.WritegetreaderquotmarkContentquot as byte 0 Convert.ToInt32getreaderquotmarkSizequot.ToString 20 Response.End 21 22 23 24 endregion 25 26 那么在TestImageStoreToDB.aspx页面中一个控件中获取该图片 只需设置图片的链接路径即可
代码如下: 1 this.Image1.ImageUrl quotOutPutImageDemo.aspxquot//链接输出图片页面即可 4数据库存储图片路径方式: 直接在数据库存储图片对资源图片较多 图片文件较大 类似银行内部系统中对VIP用户签名就是用签名图片方式存储的 这主要为了安全上考虑实际需求中使用次数频繁 且常常更新 无疑中这种使数据库中数据显得有些臃肿 数据容量增大同时也增加了访问数据库服务器的负载而使用存储图片路径的方式:图片文件放在服务器硬盘上数据库中只需一个文件路径指向硬盘上图片文件即可 存储方式相比存储字节流要简单容易控制 但是我在网上发现关于这种页面显示的诸多问题如下我说明一下再Asp.net对图片页面显示控制: 数据库中存储路径为绝对路径: 截图如下 现在页面放一个服务器端的Image控件和Html中的ltimg/gt来验证. 如果直接用绝对路径对控件进行赋值 页面并不显示.其实这就涉及到.net中绝对路径相对路径和虚拟路径三者之间转换的问题: 绝对路径是不行的在硬盘上存储文件命名是唯一的同时不会存在不同的文件格式相同的命名情况过滤绝对路径从绝对路径就能看出图片的存储位置就在根目录下FileuploadDict文件夹下我们只需把这个绝对路径转换成程序可用相对路径即可: 同时我们用服务器端的Image控件和Html测试一下结果: 1 //getfilepath是获得数据中图片存储路径markLinkUrl字段数据 2 if string.IsNullOrEmptygetfilepath 3 4 //截取当前图片文件名 5 string getclintpath getfilepath.Substringgetfilepath.LastIndexOf 6 7 // 路径/ 仅对 ASP.NET 的服务器控件起作用 / 的意思是相对站点的虚拟根路径 8 //“”表示的路径是当前应用程序的跟目录。
“”和上面介绍的“/”最大的区别是由服务器进行动态解释 9 getclintpathquotFileuploadDictquotgetclintpath//拼接成客户端服务器端路径 10 11 //设置Html中ltImg/gt 注意quotquot对基于后台程序来动态解析的 所以Img标签 添加Runat“Server” 在服务器端可以访问到 12 this.clintimg.Src getclintpath//测试结果成功显示 13 复制
代码 来看一下对于服务器端控件页面控制显示方式: 1 //getfilepath是从数据库获得图片存储绝对路径markLinkUrl的值 2 if string.IsNullOrEmptygetfilepath 3 4 //截取文件的名称 5 string getclintpath getfilepath.Substringgetfilepath.LastIndexOf 6 7 //服务器端-重置获取当前路径下服务器端虚拟应用程序根路径-成功 8 //使用quot/quot所有的路径都是从站点的跟目录开始的例如/default.aspx指向的是localhost/default.aspx 9 this.Image2.ImageUrl HttpContext.Current.Request.ApplicationPath quotFileuploadDictquot getfilepath.Substringgetfilepath.LastIndexOf 10 //测试结果:页面成功显示 11 复制
代码 在设置服务器端Image控件时用的是HttpContent.current.Request获取当前请求的HttpRequest对象.ApplicationPath获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径 来设置.我们来比对一下页面的路径: Html中ltImg/gt标签: FileuploadDict2010-02-03-08-35-47rr4hnz45msimfqzh4tcdv545http_imgload6.jpg Image服务端控件: /FileuploadDict2010-02-03-08-35-47rr4hnz45msimfqzh4tcdv545http_imgload6.jpg 上面用的都是虚拟目录下相对路径来访问如果直接通过拼接类似如上字符串 来对控件赋值 在Html页面时不识别的 / 仅对 ASP.NET 的服务器空件起作用.其实这就是关于Asp.net中相对路径的使用问题:处理方式如下 A: 如果链接中源端点和目标端点在同一个目录下则在链接中只需要指明目标端点的文档名称就可以了 B:使用quot/quot所有的路径都是从站点的跟目录开始的例如/default.aspx指向的是localhost/default.aspx C:如果在链接中源端点和目标端点不位于同一个目录下则只需要将目录的相对关系表达出来就可以了。
如果链接指向的文档没有位于当前目录的子级目录中则可以利用”..”符号来表示当前的父目录多个..符号可以表示根高的父级目录从而构建出目录的相对位置. D:在ASP.NET里增加了一个新的表达方法“”“”表示的路径是当前应用程序的跟目录。
“”和上面介绍的“/”最大的区别是由服务器进行动态解释。
由于””是相对于应用程序的根目录所以利用它可以简化路径的设置在某些情况下似乎还必须使用该控件 前面3种方法都是客户端解析的也就是html种的源码就是这样由浏览器来解析定向而第四种方法是在服务器端解析浏览器并不识别所以常常在后台拼接时会出现字符串和服务器控件字符串相同 页面却无法显示图片问题归咎还是Asp.net相对路径使用问题. 项目源码下载地址:/Files/chenkai/项目编码源文件/TestNetWorkConAPI.rar修改后下载链接-测试下载通过 分类: 04.Asp.NetC 标签: 异常处理 Asp.net 图片展示 文件上传 绿色通道好文要顶关注我收藏该文与我联系 chenkai 关注 - 14 粉丝 - 287荣誉推荐博客 加关注60请您对文章做出评价?? 博主前一篇2010年初的一点随想 ?? 博主后一篇AjaxControltoolkit工具包安装步骤说明 Categories: 04.Asp.NetC Tags: 异常处理 Asp.net 图片展示 文件上传 Add your comment 31 条回复 2131641 1楼楼主 chenkai 2010-02-03 11:54 文件下载测试成功 如文件不能下载 请留言通知我 我会及时修改下载链接... 回复 引用 查看 2楼 LanceZhang 2010-02-03 12:02 虽然简单但楼主写的很用心支持 回复 引用 查看 3楼楼主 chenkai 2010-02-03 12:04 LanceZhang 确实是一个很简单的运用 但是我是看到网上太多了误导了 所以小结了一篇..就是把其中注意的细节说清楚 回复 引用 查看 4楼 LanceZhang 2010-02-03 12:04 不能下载了 Link Information: All download slots for this link are currently filled. Please try again momentarily. 把文件放在国外这些垃圾网盘上还不如直接传到cnblogs或者live上 回复 引用 查看 5楼 恒星的恒心 2010-02-03 12:05 upupup 好认真 回复 引用 查看 6楼 恒星的恒心 2010-02-03 12:06 就是源码下载有问题啊 回复 引用 查看 7楼楼主 chenkai 2010-02-03 12:07 LanceZhang 奥 是吗 刚刚测试通过了 那我修改一下下载链接... 回复 引用 查看 8楼 码农SeraphWU 2010-02-03 12:09 正好对我有帮助收藏了仔细看看感谢了 回复 引用 查看 9楼楼主 chenkai 2010-02-03 12:11 LanceZhang 刚刚测试通过了 那我修改一下链接... 回复 引用 查看 10.
上一篇:
vc 编程技术600个大型项目源码(十)
下一篇:
经腹腔镜治疗异位妊娠的护理论文