zoukankan      html  css  js  c++  java
  • 谈mvc开发中gzip压缩的应用

    压缩view的内容,可加过滤器

      public class GzipFilter : ActionFilterAttribute
        {
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
                string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
                if (String.IsNullOrEmpty(acceptEncoding)) return;
                var response = filterContext.HttpContext.Response;
                acceptEncoding = acceptEncoding.ToUpperInvariant();
    
                if (acceptEncoding.Contains("GZIP"))
                {
                    response.AppendHeader("Content-Encoding", "gzip");
                    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                }
                else if (acceptEncoding.Contains("DEFLATE"))
                {
                    response.AppendHeader("Content-Encoding", "deflate");
                    response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                }
            }
        }

    然后在要压缩的页面控制器上加标签。

           [GzipFilter]
            public ActionResult Index()

    现在基本上所有的浏览器支持gzip, deflate.

    这里是编程对css和js文件进行压缩放在本地,然后发送给客户端。

    ----这种方法在iis7.5的集成模式下有效,在vs中有效,但在iis6里我还没配置好,无效

    ----关键是请求,只对action有效,像js,css文件的请求,在BeginRequest里检测不到。这种方法运行在iis7里很完美,文件大概会被压缩到原来的1/3到1/4.

    此方法主要是给请求的文件加上http头//Response.AppendHeader("Content-Encoding", "gzip"); 这里很难处理。

    如果有谁找到iis6里面可以运行的方法麻烦告诉我,或许能一起讨论找到更好的解决方案,非常感谢!

    ---pukuimin@qq.com

    浏览器检测到这个头,就会对文件进行解压缩,就正常运行了。

            protected void Application_BeginRequest(object sender, EventArgs e)
            {
                GzipFiles();
            }
    
            private void GzipFiles()
            {
                string acceptEncoding = Request.Headers["Accept-Encoding"];
                string filepath = Request.FilePath;
                string mapfilepath = Server.MapPath("~" + filepath);
                if (acceptEncoding.Contains("gzip"))
                {
                    #region Gzip处理
                    if (filepath.EndsWith(".css"))//css文件处理
                    {
    
                        Response.AppendHeader("Content-Type", "text/css");
                        Request.ContentType = "text/css";
                        if (filepath.EndsWith("gzip.css"))
                        {
                            FileInfo fi = new FileInfo(mapfilepath);
                            Response.AppendHeader("Content-Encoding", "gzip");
                            int len = mapfilepath.Length - "gzip.css".Length;
                            if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
                        }
                    }
                    else if (filepath.EndsWith(".js"))//js文件处理
                    {
                        Response.AppendHeader("Content-Type", "application/x-javascript");
                        Request.ContentType = "application/x-javascript";
                        if (filepath.EndsWith("gzip.js"))
                        {
                            FileInfo fi = new FileInfo(mapfilepath);
                            Response.AppendHeader("Content-Encoding", "gzip");
                            int len = mapfilepath.Length - "gzip.js".Length;
                            if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
                        }
                    }
                    #endregion
                }
                else if (acceptEncoding.Contains("deflate"))
                {
                    #region deflate处理
                    if (filepath.EndsWith(".css"))//css文件处理
                    {
    
                        Response.AppendHeader("Content-Type", "text/css");
                        Request.ContentType = "text/css";
                        if (filepath.EndsWith("deflate.css"))
                        {
                            FileInfo fi = new FileInfo(mapfilepath);
                            Response.AppendHeader("Content-Encoding", "gzip");
                            int len = mapfilepath.Length - "deflate.css".Length;
                            if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
                        }
                    }
                    else if (filepath.EndsWith(".js"))//js文件处理
                    {
                        Response.AppendHeader("Content-Type", "application/x-javascript");
                        Request.ContentType = "application/x-javascript";
                        if (filepath.EndsWith("deflate.js"))
                        {
                            FileInfo fi = new FileInfo(mapfilepath);
                            Response.AppendHeader("Content-Encoding", "gzip");
                            int len = mapfilepath.Length - "deflate.js".Length;
                            if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
                        }
                    }
                    #endregion
                }
            }
    
            public void GZip(string fileName, string gipFileName)
            {
    
                FileStream fr = File.Create(gipFileName);
                FileStream fc = File.OpenRead(fileName);
                GZipStream gzs = new GZipStream(fr, CompressionMode.Compress); //压缩文件类
                byte[] arr = new byte[fc.Length];
                fc.Read(arr, 0, (int)fc.Length);
                gzs.Write(arr, 0, (int)fc.Length);
                gzs.Close();
                fc.Close();
                fr.Close();
            }
    
            //解压缩文件方法
            public void DeZGip(string fileName, string gipFileName)
            {
                //准备输入输出文件
                FileStream fc = File.Create(fileName);
                FileStream fr = File.OpenRead(gipFileName);
    
                GZipStream gzs = new GZipStream(fr, CompressionMode.Decompress);
                byte[] arr = new byte[fr.Length];
                fr.Read(arr, 0, (int)fr.Length);
                fc.Write(arr, 0, (int)fr.Length);
                gzs.Close();
                fr.Close();
                fc.Close();
            }
  • 相关阅读:
    BZOJ3899 仙人掌树的同构(圆方树+哈希)
    BZOJ3590 SNOI2013Quare(状压dp)
    BZOJ2178 圆的面积并(simpson积分)
    BZOJ3724 PA2014Final Krolestwo(欧拉回路+构造)
    BZOJ3589 动态树(树链剖分+容斥原理)
    BZOJ3453 XLkxc(拉格朗日插值)
    BZOJ4650 NOI2016优秀的拆分(后缀数组)
    Luogu5058 ZJOI2004嗅探器(割点)
    shutil模块---文件,文件夹复制、删除、压缩等处理
    面向过程---通过查找字符串,找到相应的文件路径
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/7536421.html
Copyright © 2011-2022 走看看