ImageResizer и изображения, доставленные в виде потока байтов

У нас есть веб-сайт umbraco MVC, с которым мы пытаемся использовать ImageResizer. Чтобы загруженные файлы не находились в общедоступной области, изображения хранятся за пределами веб-корня, и мы используем контроллер для их доставки в браузер (например, 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);
        }
    }
}

Если мы используем URL API для общедоступного изображения (например, <img src="/images/kitty.jpg?width=33&height=33&mode=crop" alt="Here there be kitties, yarrr!">), то все работает так, как ожидалось.

Однако мы безуспешно пытались использовать URL API для изменения размера наших изображений, предоставляемых контроллером (например, <img src="/umbraco/surface/AttachmentSurface/ShowImage/999?width=33&height=33&mode=crop" alt="Here there be an image, yarrr!">).

Единственный способ обойти это — использовать управляемый API и изменить размер изображения перед доставкой? Кажется, я помню, что в документации говорилось что-то о том, что использовать ее из действия MVC - плохая идея...

Спасибо за любую помощь.


person K. Meke    schedule 08.04.2015    source источник


Ответы (1)


К сожалению, ImageResizer не работает как промежуточное ПО, поскольку промежуточное ПО не может получить доступ к нужным ресурсам, чтобы хорошо выполнять свою работу. Он контролирует запрос от начала до конца и пытается плавно интегрироваться с существующими модулями аутентификации, перезаписи URL и CMS. Вот почему это не работает с действием MVC. Он не сможет кэшировать данные на диск и будет иметь серьезные потери производительности из-за двойной буферизации.

Если вы просто пытаетесь заблокировать доступ к исходным файлам, вы можете сделать это различными способами, не перемещая файлы за пределы корня (UrlAuthorization, событие AuthorizeRequest, отключение обработчиков для этой папки и т. д.).

Если вы хотите контролировать, откуда берутся изображения, вам следует реализовать класс IVirtualImageProvider. ImageResizer включает подключаемый модуль IVirtualImageProvider (названный VirtualFolder), который может предоставлять доступ к внешним/внекорневым файлам. Если ваши потребности являются базовыми, попробуйте это и откажитесь от действия MVC.

person Lilith River    schedule 08.04.2015
comment
Спасибо. VirtualFolder звучит как то, что мне нужно, но когда я пытался его использовать, я просто продолжал получать 404 (vpp=false, и я использую строку запроса). - person K. Meke; 09.04.2015
comment
Мне нужно больше информации, чтобы помочь. Попробуйте открыть новый вопрос. - person Lilith River; 09.04.2015