2013-08-27 2 views
0

У меня есть приложение .NET MVC 4, которое хранит изображения в базе данных. Я извлекая изображения, как это:.NET MVC 4: отображение изображения из объекта изображения

byte[] imageBytes = dbObject.dbImage; 
MemoryStream ms = new MemoryStream(imageBytes); 
System.Drawing.Image image = System.Drawing.Image.FromStream(ms); 

Так что теперь у меня есть образ, и я просто хочу, чтобы отобразить его в целях MVC. Я не могу понять, как это сделать, не сохраняя изображение локально, что кажется сумасшедшим. Я читал другие предложения о создании обработчика, но это кажется излишним для такой простой задачи.

Как я могу отобразить это изображение в представлении?

ответ

4

Вы можете преобразовать байты в Base64 и вставить его в data: URI.

Учтите, что это не будет работать в IE < 8.

+0

Определенно пробудили мой интерес! На странице wikipedia упоминается, что «закодированные данные загружаются каждый раз при повторной загрузке содержащихся документов». Означает ли это, что нет кеширования * или просто нет кеширования самого изображения отдельно? Это специфическое поведение веб-сервера? – CodingIntrigue

+0

@RGraham: 'data:' URI являются частью документа, содержащего их, так же, как и другой контент или URL-адреса. Они подчиняются той же политике кэширования, что и остальная часть документа. Однако документы, как правило, менее подвержены кешированию, чем изображения. Это полностью зависит от конфигурации кэширования на стороне сервера. – SLaks

+0

Awesome. Вам определенно это не нужно, но вы получите мой +1 :) – CodingIntrigue

2

Вы можете создать действие, которое возвращает изображение, например,

Контроллер

public ActionResult GetImage(int imageId) { 
    byte[] imageBytes = dbObject.dbImage; 
    MemoryStream ms = new MemoryStream(imageBytes); 
    return File(ms, "image/png", "myimage.png"); 
} 

Посмотреть

<img src="@Url.Action("GetImage", "MyController", new { imageId = 1 })" alt="MyImage" /> 
+0

Мое изображение не отображается, когда я это делаю. На самом деле, не похоже, что «GetImage» даже называется, т. Е. Я поставил точку останова, и он никогда не был достигнут. –

+1

@JamesHarpe: Он будет вызываться как отдельный HTTP-запрос браузером. – SLaks

1

Вы можете просто использовать FileResult

Контроллер

public ActionResult Images() { 
    byte[] imageBytes = dbObject.dbImage; 
    return File(imageBytes, "image/png"); 
} 

Посмотреть

<img src="@Url.Action("Images", "Controller")" /> 
+0

Мое изображение не отображается, когда я это делаю. Размещение прерывания в методе «Изображения» показывает, что метод никогда не вызывается. –

Смежные вопросы