一段时间以来,我一直在使用以下大部分 Global.asax (Application_Start) 代码,效果很好(相关)。我已经以这种方式配置它,以便在外部发起请求(热链接/直接请求)时在某些目录上提供带水印的图像。
//ImageResizer
Config.Current.Pipeline.Rewrite += delegate(IHttpModule mysender, HttpContext context, IUrlEventArgs ev)
{
if (context.Request.UrlReferrer == null || (context.Request.UrlReferrer != null && context.Request.UrlReferrer.Host != "www.mydomain.com"))
{
//File has been requested from outside of the target domain, so see if it meets criteria for watermarking
string folder1 = VirtualPathUtility.ToAbsolute("~/images/products");
string folder2 = VirtualPathUtility.ToAbsolute("~/images/product-showcase");
if (ev.VirtualPath.StartsWith(folder1, StringComparison.OrdinalIgnoreCase) || ev.VirtualPath.StartsWith(folder2, StringComparison.OrdinalIgnoreCase))
{
//Image is within the targeted folders. If the requested file is jpg, change extension to png
if (Path.GetExtension(ev.VirtualPath) == ".jpg") ev.VirtualPath = Path.ChangeExtension(ev.VirtualPath, ".png");
//Estimate final image size, based on the original image being 300x300.
System.Drawing.Size estimatedSize = ImageBuilder.Current.GetFinalSize(new System.Drawing.Size(300, 300), new ResizeSettings(ev.QueryString));
if (estimatedSize.Width > 100 || estimatedSize.Height > 100)
{
//It's over 100px, apply watermark and change the ouput format
ev.QueryString["watermark"] = "style";
ev.QueryString["bgcolor"] = "ffffff";
ev.QueryString["format"] = "jpg";
}
}
}
};
但是,我刚刚修改了我的网页,以便通过添加 &format=jpg 查询字符串来提供我的产品图像。我知道适当的 MIME 类型会提供给 Web 浏览器,这真的很酷,但是文件名呢?例如 /images/products/widget1.png?watermark=c&format=jpg 仍然指的是 png 图像,即使提供的格式是 jpg。我担心的是,像 Google 图片这样的抓取工具或图像聚合器可能 1)想要将 URL 剥离为文件名,或者 2)考虑 MIME 类型并通过更改扩展名重新引用它。我不确定 Google 图片实际上对上述 URL 做了什么,并且想要处理这两种情况。[如果我知道的话,我可能会更好地针对这种情况]
为了处理场景 2,我只是在上面添加了路径扩展检查,一切都处理得很顺利。顺便说一句,我在目标目录中只有 .png 图像。
对于场景 1,对 .png 文件的外部请求通过,但该文件实际上被编码为 .jpg,这就是失败的部分。我希望我可以重写扩展。我尝试使用 Response.Redirect 执行此操作,但由于我在 Application_Start 内部工作,因此我无权访问它。