• 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的参考文档,请关注.

  • 相关阅读:
    知乎高赞:假如我有500w存进余额宝,可以每天坐着等吃吗?
    为什么想举办一场 中国深圳•测试开发大会
    2020 年互联网大厂薪资出炉!老夫酸了.......
    再见,我亲手创办的公司
    互联网公司的年会也太太太刺激了吧!
    python环境安装及配置
    Python isdigit()方法
    购物车程序优化2
    python中常见的报错信息
    pycharm中的快捷键
  • 原文地址:https://www.cnblogs.com/yans/p/1682790.html
Copyright © 2020-2023  润新知