1、创建HttpHandler
(1)先添加ASP.NET3.5应用程序
(2)新建项,添加一般应用程序,后缀.ashx
(3)默认创建的内容为
2、数字水印
数字水印的技术使用,能够很好的保护著作权,防止他人盗用受保护的资源
数字水印的实现可以有三种方式
- 直接编辑每张图片,(但需要大量的人力)
- 编程实现批量编辑图片,(节省人力,且提高效率,但丢失了原始的图片)
- 在显示图片时,动态添加数字水印效果(使用HttpHandler,效率高,节省人力,且可以保存原始图片)
3、数字水印的实现(指定Handler方式)
修改.ashx文件提供的默认代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
namespace 第二章_课堂练习
{
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{
private string IMGS = "~/ProductImgs/";
public void ProcessRequest(HttpContext context)
{//定义新的图片
Image img;
//获取图片的物理路径
string path = context.Request.MapPath(IMGS + context.Request.Params["id"] + ".jpg");
//判断图片的物理路径是否存在
if (File.Exists(path))
{//加载图片
img = Image.FromFile(path);
// 定义画布
Graphics graphics = Graphics.FromImage(img);
//在Image上绘制水印
graphics.DrawString("测试文本",new Font("微软雅黑",20),Brushes.DeepPink,0,0);
//释放画布
graphics.Dispose();
}
else{
img = null ;
}
//设置输出类型为JPEG图片
context.Response.ContentType = "image/jpeg";
//将修改的图片存入输出流
img.Save(context.Response.OutputStream,ImageFormat.Jpeg);
//释放画布
img.Dispose();
//输出结束
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
修改前台数字水印访问图片的路径
实现效果,如图所示
4、数字水印实现(全局Handler方式)
使用指定Handler方式的做法仍有缺憾,因为它还需要把图片的路径都修改掉,而全局Handler可以在不修改任何访问路径的情况下实现图片的数字水印效果。
思路分析:
- 修改配置信息web.config,将所有对.jpg内容的访问转到HttpHandler处理程序
- 获得访问请求,得到用户访问的图片路径
- 根据请求的路径查找相对应的图片
- 将网站标识在封面图片的左下角书输出
- 修改程序的输出类型,并将组合出的新图片输出
修改web.config文件,在文件中添加以下代码行
<httpHandlers>
<add verb="*" path="ProductImgs/*.jpg" type="第二章_课堂练习.Handler1"/>
</httpHandlers>
- verb:制定谓词列表可以是以逗号分隔的HTTP谓词列表(例如,“GET”,“PUT”,“POST”) [*]通配符,此处标识所有的请求
- path:指定路径属性可以包含单个URL路径或简单的通配符字符串(如*.aspx),此处代表所有针对“ProductImgs/*.jpg”路径的请求都将交给Handler1类处理
- type:指定逗号分隔的类/程序集组合
修改.ashx文件提供的默认代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
namespace 第二章_课堂练习
{
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{//定义新的图片
Image img;
//获取图片的物理路径
string path = context.Request.PhysicalPath;
//判断图片的物理路径是否存在
if (File.Exists(path))
{//加载图片
img = Image.FromFile(path);
// 定义画布
Graphics graphics = Graphics.FromImage(img);
//在Image上绘制水印
graphics.DrawString("测试文本",new Font("微软雅黑",20),Brushes.DeepPink,0,0);
//释放画布
graphics.Dispose();
}
else{
img = null ;
}
//设置输出类型为JPEG图片
context.Response.ContentType = "image/jpeg";
//将修改的图片存入输出流
img.Save(context.Response.OutputStream,ImageFormat.Jpeg);
//释放画布
img.Dispose();
//输出结束
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
此代码与上述代码非常相似,只不过我们不需要获取ID值,也不需要在修改前台图片的访问路径。
实现效果
当我们使用全局Handler时,后台代码写好不动,前台添加新的图片路径,一样可以添加数字水印效果
例:
注意:使用这种配置方式,在开发服务器上运行时没有任何问题,可是当我们将网站部署到IIS上运行时,就会没有任何的效果。原因是我们在开发调试时使用的VS提供的开发服务器,它仅提供了最简单的Web服务器功能,它不会对请求内容做任何的处理,而直接将所有的请求转交给ASP.NET处理。IIS却是一个比较完善,功能强大的Web服务器。我们所有提交到的 IIS的请求,都会依据后缀名而做一些分类处理。默认情况下,.html、.jpg等静态格式文件IIS不会做任何处理而直接将结果返回。只有当后缀名符合相关条件时(如.aspx,asp)才会将请求扎un交给相应的处理程序。