Отображение картинок из БД в 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.