Freigeben über


Отображение картинок из БД в MVC приложениях

Частый вопрос – как из контроллера MVC приложения возвращать картинки, например по адресам вроде https://mysite/images/image.gif. Отвечаю на вопрос.

1. Для того, чтобы отобразить изображение из базы данных нужно создать действие контроллера, которое будет возвращать File с требуемым заголовком. Ниже приведен пример такого действия, использующего стандартную базу AdventureWorks.

       public ActionResult Image(int id)
        {
            AdventureWorksEntities1 db = new AdventureWorksEntities1();
            ProductPhoto pr = db.ProductPhotoes.SingleOrDefault(p => p.ProductPhotoID == id);
            if (pr == null) throw new HttpException(404, "Not Found");

            return File(pr.LargePhoto, "image/gif");
        }

Теперь при обращении по пути вроде https://localhost:33181/Home/Image/161 будет отображаться изображение.

2. Для того, что путь был более красивым и прозрачным для пользователя, переопределяем маршрут и немного модифицируем действие контроллера.

Маршрут

            routes.MapRoute(
                "Images",
                "images/{imagename}",
                new { controller = "Home", action = "Image" }
            );

Действие

public ActionResult Image(string imagename)
{
    AdventureWorksEntities1 db = new AdventureWorksEntities1();
    ProductPhoto pr = db.ProductPhotoes.SingleOrDefault(p => p.LargePhotoFileName == imagename);
    if (pr == null) throw new HttpException(404, "Not Found");

    return File(pr.LargePhoto, "image/gif");
}

Теперь изображение будет отображаться по более удобочитаемому пути https://localhost:33181/images/racer02_black_f_large.gif

Описанный выше метод основан на том, что типы возвращаемых значений ActionResult полностью контролируют выдачу и формат данных может быть определен любой, как например FileContentResult, возвращаемый методом File.