数据库管理系统往往都提供二进制大对象的支持。当然,二进制对象字段不一定非要存储图像,它还可以存储媒体文件或长文本文件或其他二进制内容。

  下面以从数据库加载员工相片为例,展示一个HTTP处理程序的例子:

public class DbImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
//从查询字串中获取员工ID
int id = -1;
bool reaust = Int32.TryParse(ctx.Request.QueryString["id"], out id);
//如果未能从查询字符串中得到员工ID,则立即中断Http请求的处理
if(!result)
ctx.Response.End();

//数据库连接字串
string connString = "...";
string cmdText = "Select photo from employees where employeeid = @id";

//从数据库中读取photo字段,以获取员工相片
byte[] img = null;
SqlConnection conn
= new SqlConnection(connString);
using(conn)
{
SqlCommand cmd
= new SqlCommand(cmdText, conn);
cmd.Parameters.AddWithValue(
"@id", id);
conn.Open();
img
= (byte[])cmd.ExecuteScalar();
conn.Close();
}

if(img != null)
{
//设置HTTP标头中的ContextType字段,表明body中的数据为图像类型
ctx.Response.ContextType = "image/jpeg";
//输出图像到浏览器
ctx.Response.BinaryWrite(img);
}
}

public bool IsReusable
{
get { return true; }
}
}

  这段代码做了几点假设:首先,名为photo的字段存储的是图像数据,且以JPEG格式存储;其次,图像是通过预定义的连接字符串从固定的数据库表中获取;最后,调用该处理程序的URL要包含一个名为id的查询字符串参数。

  注意,这段代码在使用查询参数ID的值前尝试对它进行类型转换。通过验证ID参数中是否包含数据型数据,能显著降低受到外界攻击的风险。

  HttpResponse对象的BinaryWrite方法能够将字节数组写入输出流。

在web.config中注册

  HTTP处理程序必须在web.config文件中注册,并绑定到一个公共端点上:

<httpHandlers>
<add verb="*" path="dbimage.axd" type="Core35.Components.dbImageHandler,Core35Lib" />
</httpHandlers>

使用

  在浏览器中输入类似如下的URL:http://localhost:57023/core35/dbimage.axd?id=1,该URL的含义是在数据库中查询员工ID为1的员工相片。

  我们还可以将类似URL绑定到Web控件上Image控件上实现动态访问图像。

posted on 2011-04-29 21:38  辛勤的代码工  阅读(329)  评论(0编辑  收藏  举报