У меня взгляд с сильным типом. Этот сильный тип имеет поле, состоящее из byte[], этот массив содержит картинку.
Можно ли отобразить это изображение с помощью чего-то вроде @Html.Image(Model.myImage)?
Большое Вам спасибо
У меня взгляд с сильным типом. Этот сильный тип имеет поле, состоящее из byte[], этот массив содержит картинку.
Можно ли отобразить это изображение с помощью чего-то вроде @Html.Image(Model.myImage)?
Большое Вам спасибо
Вы можете создать метод действия контроллера, который возвращает изображение как FileContentResult:
public FileContentResult Display(string id) {
byte[] byteArray = GetImageFromDB(id);
return new FileContentResult(byteArray, "image/jpeg");
}
Затем вы можете создать ActionLink для метода действия в представлении, используя идентификатор изображения из модели.
Это зависит от размера изображения. Если он небольшой, вы можете написать что-нибудь, чтобы закодировать его в base-64 и встроить в html, как любой из них.
конкретный пример отсюда< /а>:
<img src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPbWLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVrApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxMAF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=" alt="British Blog Directory" width="80" height="15">
Если изображение имеет заметный размер, вы можете вместо этого написать маршрут, который позволяет выполнять поиск по некоторому ключу к изображению, то есть маршрут наподобие /images/{id}
— в этом маршруте вы извлекаете двоичный файл изображения и используете return File(bytes, contentType)
, дополнительно установив заголовки кэширования (и не забудьте перепроверить всю необходимую безопасность). В вашем html у вас будет просто
<img src="/images/@imageId" ... />
(используя синтаксис бритвы, но аналогичный для aspx).
Подход с отдельным маршрутом требует дополнительного перехода к серверу, но позволяет кэшировать на клиенте (подход с встроенным base-64 помещает данные в каждый запрос).
Если у вас уже есть изображение, загруженное в вашу модель в виде массива byte[]
, вы можете сделать это, как упоминает @Marc Gravell в своем ответе:< /а>
<img src="data:image;base64,@System.Convert.ToBase64String(Model.Photo)" />
Это значительно упрощает весь процесс, и вам не нужно будет иметь определенный метод действия FileContentResult
и снова обращаться к базе данных (см. ответ @Dmitry S ) только для того, чтобы получить этот массив byte[]
с вашим изображением/фотографией, так как он уже загружен в вашу модель.
Похоже, вам понадобится новое действие, которое получает массив байтов (из базы данных?) и возвращает изображение через Файл метод....
Затем сгенерируйте привязку, указывающую на это действие, чтобы изображение могло загружаться во время загрузки страницы, ускоряя отображение.
Посмотрите на класс WebImage.
http://msdn.microsoft.com/en-us/library/system.web.helpers.webimage(v=vs.99).aspx
Я бы разработал простой универсальный обработчик для обслуживания ваших изображений. Этот обработчик мог бы с заданным параметром загружать изображения из базы данных и записывать их в поток вывода http.
public class UserImage : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpeg";
// Get the stream from the database
var image = System.Drawing.Image.FromStream(stream);
image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
}