ImageResizer和图像作为字节流传递

时间:2015-04-08 19:39:49

标签: imageresizer

我们有一个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!">)上使用网址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 Action中使用它的一个坏主意......

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

如果您只是试图阻止对原始文件的访问,则可以通过多种方式执行此操作,而无需将文件移动到根目录之外(UrlAuthorization,AuthorizeRequest事件,禁用该文件夹的处理程序等)。

如果要控制图像的来源,则应实现IVirtualImageProvider类。 ImageResizer包含一个IVirtualImageProvider插件(named VirtualFolder),可以提供对外部/外部根文件的访问。如果您的需求是基本的,请尝试一下,然后放弃MVC操作。