.NETdotNET计算机微刊

[解决方案] 自动调整图片

2017-09-14  本文已影响0人  gruan

ASP.NET 和 NETCore 的解决方法不同. 本文分两部份


ASP.NET

利用 VirtualFile / VirtualPathProviderStaticFileHandler 完成虚拟文件解析.

溯源

溯源的最简单办法是新文件源文件 名称,路径 保持一至. 而且有规则可以依, 就得把规则加到文件名中. 综合以上两点, 可以比较以下几种访问方式:

源: http://www.baidu.com/imgs/2017/09/09/abc.jpg

1. http://www.xxx.com/imgs/2017/09/09/abc.auto.s1.jpg
2. http://www.xxx.com/imgs/2017/09/09/abc.jpg?100x100
3. http://www.xxx.com/img?source=/imgs/2017/09/09/abc.jpg&w=100&h=100

综上所述, 我们这里选择第1种访问方式.
但是要使用这种方式, 就有点为难了, 因为: 没有入口 !

给个入口

静态类型的文件,ASP.NET 默认不会经过程序处理. 你可以在 GlobalBeginRequest 里设置一下断点,看能不能进来.
要想要程序可以处理静态文件,只需要在 web.config 里加入如下配置:

<system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <handlers>
    <!--设置可以由该程序处理的文件类型,必须-->
    <add name="jpg" path="*.jpg" verb="GET" type="System.Web.StaticFileHandler"/>
    <add name="gif" path="*.gif" verb="GET" type="System.Web.StaticFileHandler"/>
    <add name="png" path="*.png" verb="GET" type="System.Web.StaticFileHandler"/>
  </handlers>
</system.webServer>

至此, 你可以在 GlobalBeginRequest 里写处理程序了.

更进一层

VirtualPathProvider , VirtualFile 这两个东西的用处很多, 不了解的,可以自行搜索一下.
我了解的也不多, 只是在很久之前用它们取出 dll 中的母版页而已.这里我用它们来处理图片请求.

为了方便添加修改规则,我定义了一个热插拔的 JsonConfig. 只需要修改 Cfgs/SizeTypes.json 即可:
示例:

{
  "Types": [
    {
      "name": "s1",
      "width": 100,
      "height": 100,
      "quality": 70
    },
    {
      "name": "s2",
      "width": 200,
      "height": 200,
      "quality": 70
    },
    {
      "name": "s3",
      "width": 113,
      "height": 128
    }
  ]
}

当然, 以经生成的图片要手动删除, 才能应用新的配置


NETCore

通过修改 StaticFile 中间件的 FileProvider 来实现.

相对而言, NETCore 的实现要简单的多: 只需要修改 StaticFileMiddleware 的 FileProvider 即可.

var ap = new AutoImgFileProvider(this.Configuration);
//优先 WebRootFileProvider , 如果文件在它中能找得到,就不在去 AutoImageFileProvider 中在找一次了.
var cp = new CompositeFileProvider(env.WebRootFileProvider, ap);
var opt = new StaticFileOptions()
{
    FileProvider = cp
};

app.UseStaticFiles(opt);

需要添加 Nuget

AutoImgFileProvider 是对 PhyicalFileProvider 做了一层包装, 而不是继承.
收到请求时 (GetFileInfo), 首先调用包装的 PhyicalFileProvider.GetFileInfo , 如果目标存在, 直接返回; 否则, 和ASP.NET的流程一样: 拆分/解析/组装/保存, 然后返回.

NETCore 规则配置采用了独立的配置文件, 修改规则,只需修改:
AutoImg.json 即可
示例:

{
  "AutoImg": {
    "BaseDir": "d:\\Imgs",
    "Types": [
      {
        "name": "s1",
        "width": 100,
        "height": 100
      },
      {
        "name": "s2",
        "width": 200,
        "height": 200
      },
      {
        "name": "s3",
        "width": 113,
        "height": 128
      }
    ]
  }
}

另附

NETCore 下图片处理采用 ImageSharp , NET FX 下用的是 ImageProcessor.
ImageSharp 不支持质量百分比.

上一篇下一篇

猜你喜欢

热点阅读