根据前面三篇文章的教学
完成后可以做出来 (请您务必依照顺序学习,不要只是找范例来Copy)
- [.ashx檔?泛型处理程序?]基础入门#1....能否用中文教会我?别说火星文?
- [.ashx檔?泛型处理程序?]基础入门#2....FileUpload上传前,预览图片(两种作法--ashx与JavaScript)
- [.ashx檔?泛型处理程序?]基础入门#3....ADO.NET 与 将DB里面的二进制图片还原
本文做为书本「上集」的 Ch.18 FileUpload 补充范例
ASP.NET 4.5专题实务(I),松岗出版
方法一!
我个人是建议「档案上传时,存在 Web Server硬盘,把存盘的路径与文件名,放入DB」,这种作法最简单!
不用学习新招数就能完成
我的书本(上集) FileUpload也是介绍这种作法,书本内已经有完整范例。
方法二!本文将介绍的.....
如果您坚持要把「档案」存到数据表里面,会遇见两个关卡
2-1. 如何把图片(档案)的二进制IO Stream存入数据表的字段(请设定为 Image数据型态)
2-2. 如何把数据表里面的「二进制」数据,捞出来(读取出来),还原成图片?秀在网页上?
教学影片: http://youtu.be/JfZ3rYchlLo
依照上述第三篇文章里面,我提供的超链接。里面就有很多前辈分享他们的程序代码
看看哪个OK,您就照做,一定可以做得出来。
相关文章如下,任选一篇都能完成:
微软MSDN范例就有,请看 http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.fileupload.postedfile(v=vs.110).aspx
http://www.cnblogs.com/travelcai/archive/2007/09/27/907203.html
http://davidma168.wordpress.com/2011/01/25/ashx-%E8%BC%B8%E5%87%BA%E5%9C%96%E7%89%87/
http://davidma168.wordpress.com/2011/01/25/ashx-output-image-2/
- http://4068205.blog.51cto.com/4058205/1090928 推荐!
- http://www.dotblogs.com.tw/ligthwaver/archive/2011/09/21/37066.aspx 简单!
- http://welkingunther.pixnet.net/blog/post/25986417-(asp.net)%E7%94%A8http-handler%E6%8A%8A%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84%E4%BA%8C%E9%80%B2%E4%BD%8D%E5%9C%96%E7%89%87%E6%AA%94%E9%A1%AF
- http://www.soaspx.com/dotnet/asp.net/tech/tech_20100204_2767.html
===============================================================================================
第一,建立一个数据表
存放「图片、档案」的字段,请设定为 Image数据型态
另一个字段,要设定 MIME格式,通常是把附档名(扩展名)放进去。日后要把这些二进制数据独出来,组合成原本的图片,会用到MIME!
数据表的范例可由此下载 (.sql檔,檔名有 Image字样)
https://onedrive.live.com/?cid=6F7F668080F24B20&id=6F7F668080F24B20%21115
第二,上传的范例,可以看见 FileUpload的程序有些变化
2-1. 不需要存档了
FileUpload的 .SaveAs()方法用不到。因为档案上传后就写入数据表,不是存在 Web Server硬盘
也不用设定存盘的目录、路径
2-2. 上传后,档案(图片)的 IO Stream以「 Byte数组」的方式的方式来读取
便可以把这个 Byte数组的内容(图片的二进制数据),存入数据表中
第三,把DB里面的图片(二进制)还原,秀在网页上
这里我用了两种作法,不过原理都相同
简言之,把读取、还原成图片的动作,放在 .ashx程序里面
3-1. 一般的 Image控件
<asp:Image ID="Image1" runat="server"
ImageUrl='<%# "FileUpload_DB_Image_02_Display.ashx?id=" + Eval("FileUpload_DB_id")%>' />
3-2. 大型控件里面的 ImageField 样板字段
<asp:GridView ,,,,,>
<asp:ImageField DataImageUrlField="FileUpload_DB_id(数据表的域名!)"
DataImageUrlFormatString="FileUpload_DB_Image_02_Display.ashx?id={0}">
</asp:ImageField>
</asp:Gridview>
第四,把图片的读取(从数据库捞出来)。还原成原本的图片MIME格式,都是用 ashx程序来做
本系列的范例,不就是介绍 ASHX吗?
回头看看第一步骤,我们的 FileUpload_DB2 数据表里面,多设计两个「字段」,
一个存放「图片(二进制)」,另外一个存放「扩展名」作为MIME
............原理是不是很清楚了?
===============================================================================================
档案下载:
因为这些范例,也是网络上学习到的
前辈们愿意分享,我做好后也愿意分享 ( 记得要搭配第一个步骤,先把您的 FileUpload_DB2数据表设定完成 )
知识 因为分享而伟大
把 "大容量"的图片、档案放到数据表的「字段」里面,会有一些缺陷
上课的时候将为您报告这几点。
您也可以参阅 SQL 2012的 FileStream,试着了解为何有这些改进?
改善了哪些地方?......以下是 msdn网站的说明
FILESTREAM 可让 SQL Server 架构应用程序在文件系统上储存非结构化的数据,例如文件和影像。 应用程序可以利用文件系统的丰富数据流 API 和效能,并同时维护非结构化数据与对应结构化数据之间的交易一致性。
FILESTREAM 会将 SQL Server Database Engine 与 NTFS 文件系统整合,方法是将 varbinary(max) 二进制大型对象 (BLOB) 数据当做档案储存在文件系统上。 Transact-SQL 语句可以插入、更新、查询、搜寻和备份 FILESTREAM 数据。 Win32 文件系统接口提供了数据的数据流方式存取。
FILESTREAM 会使用 NT 系统快取来储存档案数据。 如此可减少 FILESTREAM 数据可能对 Database Engine 效能产生的任何影响。 并不会使用 SQL Server 缓冲池;因此,此内存可用于查询处理。
当您安装或升级 SQL Server 时,并不会自动启用 FILESTREAM。 您必须使用 SQL Server 组态管理员和 SQL Server Management Studio 来启用 FILESTREAM。 若要使用 FILESTREAM,您必须建立或修改数据库,以便包含特殊类型的档案群组。 然后,请建立或修改数据表,让它包含具有 FILESTREAM 属性的 varbinary(max) 数据行。 完成这些工作之后,您就可以使用 Transact-SQL 和 Win32 来管理 FILESTREAM 资料。
想要作到上传图片以后,还要「缩图」
FileUpload以后,缩图(大图变小图)
搜寻关键词「ASP.NET 缩图」就能找到很多范例,可以参阅这几篇文章,很清楚:
http://wangshifuola.blogspot.tw/2011/10/aspnetimage-resize.html