原文地址:http://blog.163.com/sun__haiming/blog/static/12830906820099226610677/
HttpHander是一般处理程序,他是一个容器 , 通过了解HttpHader会帮助我们进一步了解到 ASP.NET的运行机制。每一个HttapHander其实包括一个及以上的HttpModule的,那么什么是HttpModule呢?
HttpModule:其实每一个ASP.NET中的请求要通过Httpmodule , 但是它并没有对请求进行处理, 真正的处理实在Httphander中执行的 , 就是说每一个请求首先要通过HttpModule的“检查” , 才能才能到达HttpHander的 ;形象地说,好比一个过滤器的作用:
HttpHander:它是Http请求的真正的处理中心 ,在这个容器中ASP.NET真正的对客户端请求道服务器的页面做出编译和执行,然后再将编译好的信息,加载到HttpModule中返回到客户端。
为了更好的理解这个机制, 我写了一个非常形象的例子:
在网上你常常看到一些图片的右下角会有一些标记, 以此来表示图片的来源, 保护自己的版权, 那么这个是怎么做到的呢, 有人说很简单, 对每张图片用制图软件处理不就好了么, 当然可以,但是如果你的网站的图片有上万张怎么办呢?那么还那样做么!很显然这是个很大的体力活,而其还增加了成本!所以在这里我用HttpHander来处理这个问题, [对每次加载的图片我让他经过HttpHander中我让图片的右下角加载水印图片]
1.创建CopyRightCover.ashx (HttpHander)
<%@ WebHandler Language="C#" Class="BookCover" %>
using System;
using System.Web;
using System.Drawing;
using System.IO;
public class CopyRightCover: IHttpHandler
{
//数字水印路径
private const string WATERMARK_URL = "~/Images/WaterMark.jpg";
//默认图片的路径 当你请求的图片不存在的时候
private string DEFAULTIMAGE_URL = "~/Images/default.jpg";
public void ProcessRequest(HttpContext context)
{
//组合图片的路径
string path = context.Request.MapPath(context.Request.Params["path"]);//获得请求的路径
System.Drawing.Image Cover;
if (File.Exists(path))
{
//加载文件
Cover = Image.FromFile(path);
//加载水印图片
Image watermark = Image.FromFile(context.Request.MapPath(WATERMARK_URL));
//实例化画布
Graphics g = Graphics.FromImage(Cover);
//在image上绘制水印
g.DrawImage(watermark, new Rectangle(Cover.Width - watermark.Width, Cover.Height - watermark.Height, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel);
//释放画布
g.Dispose();
//释放水印图片
watermark.Dispose();
}
else
{ //设置默认的图片
Cover = Image.FromFile(context.Request.MapPath(DEFAULTIMAGE_URL));
}
context.Response.ContentType = "image/jpeg"; //设置输出类型为jpeg图片
Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); //将修改的图片存入输出流
Cover.Dispose();
context.Response.End();
HttpResponse res = context.Response;//请求处理结束后我回到指定的页面
res.Redirect("~/BookCover.aspx?newPath=" + path); //也可以将处理后的路径回带(也可以不要)
}
public bool IsReusable
{
get
{
return false;
}
}
}
2.创建上传图片的页面:
(源)
<html id="Html1" xmlns="http://www.w3.org/1999/xhtml" runat="server" >
<head>
<title>WebForm3</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<input id="loadFile" type="file" runat="server" />
<asp:Button id="Button1" runat="server" Text="Button" On
<asp:Image id="Image1" runat="server"></asp:Image></form>
</body>
</html>
(后置.cs)
public partial class BookCover : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click1(object sender, EventArgs e)
{
String filename = loadFile.PostedFile.FileName; //获得上传图片的路径
string fileType = filename.Substring(filename.IndexOf(".")+1, filename.Length - filename.IndexOf(".")-1); //jpg
string basePath = "Upload\\";
//每次上传的名字我设置为唯一的
string keepSaveFleName = basePath + System.DateTime.Now.Date.ToShortDateString() + loadFile.PostedFile.ContentLength.ToString() + "new." + fileType;
//注意keepSaveFleName一定要是虚拟的路径
loadFile.PostedFile.SaveAs(Server.MapPath(keepSaveFleName));
//跳转到Httphander处理水印显示在页面上
Response.Redirect("BookCover.ashx?path="+keepSaveFleName);
//第一种方式 keepSaveFleName这个为什么有水印呢??这是因为你keepSaveFleName不是当前的路径了而是经Hander处理后的keepSaveFleName
//Image1.ImageUrl = keepSaveFleName;
//第二种方式 我将处理后的keepSaveFleName存储到path里面在或的就好了
Image1.ImageUrl = Request.Params["path"];
}
}
[注意:我在项目中创建了一个CRHttpHander文件夹来装这些文件,在此文件夹创建Upload文件夹来放你上传的图片,创建与CRHttpHander平级目录Images里面放两个图片:default.jpg和WaterMark.jpg]
OK结束了, 您只要将我写的DEMO复制过去试试就好了!