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配置

ExpandedBlockStart.gif 代码
<? 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

 

ExpandedBlockStart.gif 代码
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.程序的实现:

ExpandedBlockStart.gif 代码
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 " ;
                
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的参考文档,请关注.

转载于:https://www.cnblogs.com/yans/archive/2010/03/10/1682790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值