记得以前做过的电子商务项目里,产品图片是要经过服务器端去控制获取的,那时使用的是Http Handler.
实现的方法大致如下:
实现接口
{
public bool IsReusable {
get { return true ; }
}
public void ProcessRequest( HttpContext context ) {
context.Response.Write(context.Request.QueryString);
// TODO:实现图片的获取
}
}
web.config配置
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
< 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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
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.程序的实现:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
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的参考文档,请关注.