MVC中控制图片获取,再见啦Http Handler
记得以前做过的电子商务项目里,产品图片是要经过服务器端去控制获取的,那时使用的是Http Handler.
实现的方法大致如下:
实现接口
{
public bool IsReusable {
get { return true; }
}
public void ProcessRequest( HttpContext context ) {
context.Response.Write(context.Request.QueryString);
//TODO:实现图片的获取
}
}
web.config配置
<configuration>
<system.web>
<pages>
<httpHandlers>
<add verb="*" path="yans.axd" validate="false" type="Yans.KJ76.Controllers.YansImageHandler"/>
</httpHandlers>
</pages>
</system.web>
</configuration>
这样你就可以通过 yans.axd 访问你自己设定的httphandler, 达到控制图片获取的目的.
但这不并是重点.
这篇blog要讲的是在MVC如果更简单更直接地去实现图片真实地址的隐藏及获取.
举例: 一张图片名为mylove.jpg的图片,放在/Content/img目录下, 我要实现网页通过/Images/mylove.jpg去获取这张图片.
如何达到这个目的呢? 请往下看:
1.路由的修改.
众所周知:ASP.NET MVC加入了非常强大的Routing模块, 其功能源自UrlRewriter.
对于地址的隐藏,我们只要修改Global.asax.cs
{
public static void RegisterRoutes( RouteCollection routes ) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Images",
"Images/{id}",
new { controller = "Map", action = "GetImage", id = "" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
}
其中加入了新的路由:
"Images",
"Images/{id}",
new { controller = "Map", action = "GetImage", id = "" }
);
表示将所有对"Images/" 下的访问都重写到/Map/GetImage 方法下,并把 ""Images/" 后的参数以属性名为id的字符串传入.
请注意这个规则的第2个参数不能在前面加"/" ,并且要放在 "Default" 规则前面.
2.程序的实现:
{
public class MapController : Controller {
public FileResult GetImage( string id ) {
string path = Path.Combine(Server.MapPath("/Content/Img"), id);
return base.File(path, GetContentType(path));
}
string GetContentType( string filename ) {
FileInfo file = new FileInfo(filename);
switch (file.Extension.ToUpper()) {
case ".PNG": return "image/png";
case ".JPG": return "image/jpeg";
case ".JPEG": return "image/jpeg";
case ".GIF": return "image/gif";
case ".BMP": return "image/bmp";
case ".TIFF": return "image/tiff";
default: throw new NotSupportedException("文件类型不支持.");
}
}
}
}
这样你就可以通过地址 "/Images/mylove.jpg" 访问到 "/Content/Img/mylove.jpg".
很明显,访问 "/Images/mylove.jpg" 远远比 访问 "yans.axd?img=mylove" 舒服多了,对吧?
总结:
1.可以根据用户或其它条件去控制用户最终获取的图片,这里需要对方法 "GetImage" 做相应的修改.
2.除了图片之外.还可以去控制其它类型的文件,当然这里要给出不同的ContentType.
可能有人会问:"wmv文件的contentType是什么呀?" 这问题问得好. 一会我再发一篇ContentType的参考文档,请关注.