ImageResizer 和图像以字节流形式传送

ImageResizer and Images delivered as byte stream

我们有一个 umbraco MVC 网站,我们正在尝试使用 ImageResizer。为了使上传的文件远离公共访问区域,图像存储在 webroot 之外,我们使用控制器将它们传送到浏览器(例如,页面上的图像 url 类似于 <img src="/umbraco/surface/AttachmentSurface/ShowImage/999?" alt="Here there be an image, yarrr!">)

ShowImage 动作类似于:

public ActionResult ShowImage(int id)
{
    using (DBContext db = new DBContext())
    {
        Attachment a = db.Attachments.FirstOrDefault(x.ID == id);
        if (a != null)
        {
            byte[] file = System.IO.File.ReadAllBytes(System.IO.Path.Combine(System.Configuration.ConfigurationManager.AppSettings["UploadPath"], a.Path, a.FileName));
            return this.File(file, a.MimeType);
        }
    }
}

如果我们在可公开访问的图像(例如 <img src="/images/kitty.jpg?width=33&height=33&mode=crop" alt="Here there be kitties, yarrr!">)上使用 URL API,那么一切都会按预期进行。

但是,我们已经尝试使用 URL API 来调整控制器传送的图像大小,但没有成功(例如 <img src="/umbraco/surface/AttachmentSurface/ShowImage/999?width=33&height=33&mode=crop" alt="Here there be an image, yarrr!">)。

解决此问题的唯一方法是使用托管 API 并在传送前调整图像大小吗?我似乎记得文档说了一些大意是在 MVC 操作中使用它是个坏主意...

感谢您的帮助。

ImageResizer 不作为中间件运行,不幸的是,中间件无法访问正确的资源以做好工作。它从头到尾控制请求,并尝试与现有的身份验证、URL 重写和 CMS 模块顺利集成。这就是为什么它不适用于 MVC 操作的原因。它无法缓存到磁盘,并且双缓冲会带来严重的性能开销。

如果您只是想阻止对原始文件的访问,您可以通过多种方式来实现,而无需将文件移出根目录(UrlAuthorization、AuthorizeRequest 事件、禁用该文件夹的处理程序等)。

如果你想控制图像的来源,你应该实现 IVirtualImageProvider class。 ImageResizer 包含一个 IVirtualImageProvider 插件 (named VirtualFolder),可以提供对 external/off 根文件的访问。如果您的需求是基本的,请尝试一下,并放弃 MVC 操作。