65.9K
CodeProject 正在变化。 阅读更多。
Home

从数据库绑定图像到 DataGrid(Web 应用程序)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.27/5 (11投票s)

2007年4月30日

CPOL

3分钟阅读

viewsIcon

84141

downloadIcon

1519

处理将图像上传/下载到数据库和从数据库到 DataGrid 的过程

引言

如果需要从数据库上传和下载图像,以下示例将对您有所帮助。我曾遇到过一些示例,它们帮助我将图像通过响应的输出流绑定到页面。但在某些情况下,图像需要绑定到 DataGrid、DataList、GridView 的某一列,这时您不能使用响应流。在这种情况下,您需要将图像保存到某个临时文件夹以供显示。<asp:Image 控件无法用于显示图像,因为 asp:Image 控件是以编码值(例如 C://My%20%Documents/My%20%Pictures)呈现的。为了解决这些问题,我使用了普通的 Html 图像控件,并在绑定值时动态设置了 "src" 属性。

在给定的示例中,图像文件被转换为字节数组并与文件扩展名一起存储在数据库中。检索时,字节数组被发送到内存流,存储在临时文件夹中并在网格中显示。

使用代码

数据库

1. 在数据库中创建一个表,其中图像字段为 Varbinary(Max),ImageType 字段为 varchar(20),分别用于存储图像和图像文件扩展名。

示例表

/****** 对象:表 [transact].[TestImageStore] 脚本日期:2007 年 4 月 30 日 11:50:40 ******/

创建

表 [transact].[TestImageStore](

[img] [varbinary]

(max) NULL,

[Image_Type] [varchar]

(20) NULL,

[imgID] [int]

IDENTITY(1,1) NOT NULL, CONSTRAINT [PK_TestImageStore] PRIMARY KEY CLUSTERED

(

[imgID]

ASC

)

ON [PRIMARY]

在应用程序中:

下载并绑定图像到网格

1. 向 aspx 页面添加一个 DataGrid。

2. 创建 TemplateColumn,用于在其中放置一个 Html 图像控件。

3. 设置 Html 图像控件的 "ID" 和 "runat" 属性,并从网格中的 Html 图像控件中移除 "src" 属性。

4. 通过执行查询语句从数据库获取结果集值。

5. 将结果集绑定到 DataGrid。

6. 在网格的 Item Data Bound 事件中,从结果集中获取每个唯一 ID 的图像二进制值。

i. 将二进制值写入内存流并将其存储在系统的临时 Internet 文件夹中。

ii. 将 URL 设置为网格中 Html 图像控件的 "src" 属性。

//  // 在 Aspx 页面中  <asp:DataGrid ID="dgBindImage" runat="server" AutoGenerateColumns="false" > <Columns> <asp:TemplateColumn HeaderText="Images"> <ItemTemplate > <asp:Label ID="lblCode" Text='<%# Server.HtmlEncode(DataBinder.Eval(Container, "DataItem.imgID").ToString())%>' runat="server" /> <img id="imgPic" width="120" height="100" runat="server" /> </ItemTemplate> </asp:TemplateColumn> </Columns> </asp:DataGrid> //在代码背后  protected void dgBindImage_ItemDataBound(object sender, DataGridItemEventArgs e) { try { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { byte[] photoByte = null; string PhotoExtension = string.Empty; Label lblCode = (Label)e.Item.Cells[0].FindControl("lblCode"); HtmlImage img = (HtmlImage)e.Item.Cells[0].FindControl("imgPic"); if (dsInsp != null && img != null && lblCode != null && !string.IsNullOrEmpty(lblCode.Text)) { //从本地数据表中选择每行,ID 为  DataRow[] drowarr = dsInsp.Tables[0].Select("imgID=" + lblCode.Text); DataRow dr = drowarr[0]; if (dr != null && dr["img"] != null && dr["Image_Type"] != null) { if (dr["img"] != DBNull.Value) { photoByte = (byte[])dr["img"]; } PhotoExtension = dr["Image_Type"].ToString(); } if (photoByte != null && photoByte.Length > 1) { System.Drawing.Image newImage; //获取系统的临时 Internet 文件夹路径以存储图像文件  string strFileName = UIUtilities.GetTempFolderName() + lblCode.Text.ToString() + PhotoExtension; //将二进制数据写入内存流  using (MemoryStream stream = new MemoryStream(photoByte)) { newImage = System.Drawing.Image.FromStream(stream); //将图像文件保存到临时文件夹  newImage.Save(strFileName); img.Attributes.Add("src", strFileName); //lblAttachedFile.Text = strFileName;  } } else img.Attributes.Add("src", ""); } //
<img src="ImageFromDBtoGrid/ImageFromDbToGrid.gif">

将图像上传到数据库

1. 使用 asp:fileUpload 控件浏览图像文件。

2. 附加文件(任何类型 .gif, .Jpg, .Doc)事件将上传的文件读取为二进制数据。

3. 将二进制值存储在会话对象中,使其在页面回发后保持不变。

4. 获取图像文件的扩展名,并将其注册到隐藏页面控件,使其在页面回发后保持不变。

5. 将值设置给命令对象的参数,并插入到数据库中。

用户指南:

1. 点击浏览按钮选择一个图像文件。

2. 点击附加链接附加文件。(您可以在下面找到附加的文件路径)

3. 点击保存按钮将其存储到数据库中。

4. 点击查看按钮下载并在网格中查看图像。

(注意:下载的文件可以在 C:\Documents and Settings\<<UserName>>\Local Settings\Temporary Internet Files 文件夹中看到

UIUtilities 类提供方法

1. 将数据插入/从数据库检索。

2. 将图像读取为二进制数据

3. 获取临时互联网文件夹名称。

结论

我希望这些示例能帮助您处理网页中的图像文件。同样的方法也可以用于 .rtf、.doc 等文件。

© . All rights reserved.