ASP.NET 3.5核心编程学习笔记(44):HTTP处理程序的编写之从数据库加载图像

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

  下面以从数据库加载员工相片为例,展示一个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控件上实现动态访问图像。

你可能感兴趣的:(asp.net)