MVC中控制图片获取,再见啦Http Handler

记得以前做过的电子商务项目里,产品图片是要经过服务器端去控制获取的,那时使用的是Http Handler.

实现的方法大致如下:

实现接口

public class YansImageHandler : IHttpHandler
{
    
public bool IsReusable {
        
get { return true; }
    }

    
public void ProcessRequest( HttpContext context ) {
        context.Response.Write(context.Request.QueryString);
        
//TODO:实现图片的获取
    }
}

web.config配置

代码
<?xml version="1.0"?> 
<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 class MvcApplication : System.Web.HttpApplication
{
    
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);
    }
}

其中加入了新的路由:

routes.MapRoute(
    
"Images",
    
"Images/{id}",
    
new { controller = "Map", action = "GetImage", id = "" }
    );

表示将所有对"Images/"  下的访问都重写到/Map/GetImage 方法下,并把 ""Images/" 后的参数以属性名为id的字符串传入.

请注意这个规则的第2个参数不能在前面加"/" ,并且要放在 "Default" 规则前面.

2.程序的实现:

代码
namespace Yans.KJ76.Controllers
{
    
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";
                
defaultthrow new NotSupportedException("文件类型不支持.");
            }
        }
    }
}

这样你就可以通过地址 "/Images/mylove.jpg" 访问到 "/Content/Img/mylove.jpg".

很明显,访问 "/Images/mylove.jpg" 远远比 访问 "yans.axd?img=mylove" 舒服多了,对吧?

总结:

1.可以根据用户或其它条件去控制用户最终获取的图片,这里需要对方法 "GetImage" 做相应的修改.

2.除了图片之外.还可以去控制其它类型的文件,当然这里要给出不同的ContentType.

可能有人会问:"wmv文件的contentType是什么呀?"  这问题问得好. 一会我再发一篇ContentType的参考文档,请关注.

原文地址:https://www.cnblogs.com/yans/p/1682790.html