网站中的图片可以保存到文件系统中即专门的目录用于图片的存放这样的存储配上数据库中保存的图片路径信息相信很多网站是这么选择的这样的搭配由于存储和管理信息是分开的其优点就是对数据库的性能不会产生太大影响但是也正是由于这种分开网站的目录结构轻易是不可以变的另外图片数据的备份需要数据库和文件目录同步进行另外一种存储和管理图片的方式是将图片存到数据库中如果站点的图片数量不是太多图片不是太大这种方式是相当适合的本文我们看一下如何使用ADONET Entity Framework构建数据访问层实现将图片存到数据库中以及从数据库中获取图片
前期工作创建数据表+构建数据访问层
第一步创建数据表
表中需要一个用于保存图片的字段类型设置为image代码如下
CREATE TABLE [dbo][images](
[id] [int] IDENTITY() NOT NULL
[imagefile] [image] NOT NULL)
第二步构建数据访问层该类型的数据的插入与一般的基本SQL类型不同不过 平台上工作的程序员不需要考虑太多访问数据库的具体代码我们可以选择ADONET Entity Framework和Linq to SQL这里我们以前者为例方法简单介绍如下
项目中新建选择ADONET Entity Data Model根据向导建立到数据库的连接根据向导选择数据库中的刚才建立的表images向导结束之后项目中会添加一个edmx类型的文件默认的界面中会打开自动生成的实体类图我们在向导中选择的所有表格都会对应一个实体类默认的名称是与数据表相同此处的images对应的实体类也是images但是这样默认使用的话会造成歧义我们需要手动修改一下点击images类在属性对话框中将Name属性改为imageEntity Set Name可以改为imageSet或者不改动保持images表示的是image集合之后实体类图中对应的类名也变成image了这里假设存放图片的数据库名为XXX那么生成的管理类也就是我们后面使用最多的类名为XXXEntities
将图片保存到SQL server数据库中
首先声明一个image类型的变量不妨称之为img image img = new image();继而创建一个XXXEntities对象 XXXEntities XXX = new XXXEntities();
(注意using命名空间和添加对SystemDataEntity的引用)
web页面中添加FileUpload控件该控件提供一个属性PostedFile能够为服务器提供一个输入输出流刚好可以供我们将选择的图片读到服务器的内存里代码如下
SystemIOStream stream = FileUploadPostedFileInputStream;
byte[] buffer = new byte[streamLength];
streamRead(buffer (int)streamLength);
streamClose();
imgimagefile = buffer;
接下来就是将代表图片的字节数组存到数据库中代码如下
XXXAddToimageSet(t);
XXXSaveChanges();
这样将图片存入数据库的操作就完成了
从数据库中获取图片并显示到页面
页面showImageaspx中放入一个Image控件命名为Image由于图片是从数据库取来的二进制文件因而不像使用文件系统时图片都有自己的URL我们可以直接设置其URL为图片在网站中的路径解决方法如下新建另外一个专门用于提供图片的页面getImageaspx其功能仅仅是从数据库中读取图片
使用ResponseBinaryWrite()的方式将图片数据流输出接下来您可能已经想到了我们将image的URL设置为上述getImageaspx如果需要根据图片的id之类的信息进行选择我们为该页面提供一个额外的id参数即可
读取图片依然使用上述的XXX实体管理类比如获取id为的图片代码为
int id = intParse(RequestQueryString[id]);
image img = XXXimageSetWhere(i=> iID == id)First();
ResponseBinaryWrite(imgimageFile);
showImageaspx中为Image控件设置URL为getImageaspx?id=(可以在cs代码中编程设置也可以在aspx中静态设置)就可以正确显示需要的图片了