ASP.NET 3.5核心编程学习笔记(44):HTTP处理程序的编写之从数据库加载图像
时间:2011-04-29 来源:辛勤的代码工
数据库管理系统往往都提供二进制大对象的支持。当然,二进制对象字段不一定非要存储图像,它还可以存储媒体文件或长文本文件或其他二进制内容。
下面以从数据库加载员工相片为例,展示一个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控件上实现动态访问图像。
相关阅读 更多 +