全局的一般处理程序 --图片添加水印
指定当用户调用某个文件夹中的文件时,自动转向这个一般处理程序。
步骤:1> 新建一个类。继承 IHttpHandler接口。
2> web.config ,在<httpHandlers>节点中,<add verb="*" path="images/Covers/*.jpg" type="命名空间.类名">
verb是动作,如"GET""POST""HEAD""DEBUG""*" ,"*"表示所有请求
path应用的目录【images/Covers】及文件格式【*.jpg】
type当用户以vert指定的方式请求path指定的文件时,转交给哪个类来处理。注意命名格式:命名空间.类名
这个可以进行权限的精确控制,上传图片的时候就加上水印,缺点,原图破坏,优点:省资源。
①
public class WaterMark :IHttpHandler { #region IHttpHandler 成员 private const string WATERMARK_URL = "~/Images/watermark.jpg"; //水印图片 private const string DEFAULTIMAGE_URL = "~/Images/default.jpg"; //图片不存在,默认显示的图片 public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { //得到用户请求的图片 string filePath = context.Request.PhysicalPath;//请求路径
System.Drawing.Image Cover; //判断请求的物理路径中,是否存在文件 if (File.Exists(filePath)) { //加载文件 Cover = Image.FromFile(filePath); //加载水印图片 Image watermark = Image.FromFile(context.Server.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"; //将图片存入输出流 Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); Cover.Dispose(); context.Response.End(); } #endregion }
②
<httpHandlers> <add verb="*" path="images/BookCovers/*.jpg" type="BookShop.Web.Common.WaterMark"/> </httpHandlers>