コード例 #1
0
        public async Task Invoke(HttpContext context)
        {
            var path = context.Request.Path.Value;  // 无 host 和 querystring。如:/res/icon/add.png
            var ext  = path.GetFileExtension();

            if (!Extensions.Contains(ext))
            {
                await _next.Invoke(context);

                return;
            }

            // 原图路径校验
            var rawPath = Asp.MapPath(path);

            if (!File.Exists(rawPath))
            {
                //Asp.Error(404, "Not found");  // 因为 wwwroot 的原因,MapPath 出来的路径可能不对,就不做处理了
                await _next.Invoke(context);

                return;
            }

            // 原图输出
            var pathAndQuery = path + context.Request.QueryString;
            var mimeType     = path.GetMimeType();
            var w            = Asp.GetQueryInt("w");

            if (w == null)
            {
                Asp.WriteFile(rawPath, mimeType: mimeType);
                return;
            }

            // 缩略图参数
            var h = Asp.GetQueryInt("h");

            if (w > 1000)
            {
                w = 1000;
            }
            if (h != null && h > 1000)
            {
                h = 1000;
            }
            var key = pathAndQuery.ToLower().MD5();

            // 缩略图缓存策略
            var cachePath = Asp.MapPath(string.Format("/Caches/{0}.cache", key));

            if (!File.Exists(cachePath))
            {
                IO.PrepareDirectory(cachePath);
                var img = Painter.Thumbnail(rawPath, w.Value, h);
                img.Save(cachePath);
                img.Dispose();
            }
            Asp.WriteFile(cachePath, mimeType: mimeType);
        }