Как отобразить картинку, полученную из поля image MSSQL? - CodeHelper

Как отобразить картинку, полученную из поля image MSSQL?

2

В БД на MSSQL есть таблица с документами. Каждый документ имеет картинку, ассоциированную с ним. Она хранится в поле image. Есть сайт на SharePoint, в нем на главной странице надо отобразить список документов, изменившихся за последнюю неделю. Точнее превью этих документов: эту картинку и часть текста. Этот список формируется в web-части, помещенной на главной странице. Т.о. мы имеем следующий метод web-части, который нужно реализовать:

protected override void RenderWebPart(HtmlTextWriter writer)
{
    ...
}

Чтобы отобразить на месте web-части список с превьюшками, нужно записать во writer соответствующую html-разметку. Скажем, у меня есть набор данных с сервера с теми самыми изменившимися документами. Среди прочих полей там есть поле с картинкой (типа image) и поле с текстом документа.

п.с. Прочитал вот эту статью про создание HttpHandler'а, но это не подходит наверное, т.к. хэндлер вынужден самостоятельно в базу лезть за бинарными данными, а у меня они уже есть. Передавать их параметром не вариант, создание глобального словаря с картинками - тоже неклево.

Новые ответы


2

В методе RenderWebPart, помимо генерации разметки, можно поместить содержимое картинки в кэш (System.Web.Caching.Cache) установив таймаут, например 1 минуту.

В разметку также включить теги для картинок вида:

<img src="getimage.aspx?id=12345"></img>

И написать HttpHandler который будет получать картинку по ключу из кэша и отдавать ее клиенту.

2

Вообще, метод RenderWebPart пишет в поток вывода текстовую разметку и ресурсы должны подгружаться браузером отдельно, например с использованием того же HttpHandler'а. Конечно, в описанной архитектуре это не очень удобно. Если есть возможность переделать, то желательно хранить картинку на диске, а в базе хранить только путь. Тогда в методе RenderWebPart достаточно будет генерировать теги с указанием пути

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

Есть еще варианты встраивания данных картинки прямо в текстовый HTML, но такие подходы работают не во всех браузерах:

1 Использование src=data

Данные файла картинки можно встроить в текстовом формате в атрибут src:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAFSDNYfAAAAaklEQVR42u3XQQrAIAwAQeP%2F%2F6wf8CJBJTK9lnQ7FpHGaOurt1I34nfH9pMMZAZ8BwMGEvvh%2BBsJCAgICLwIOA8EBAQEBAQEBAQEBK79H5RfIQAAAAAAAAAAAAAAAAAAAAAAAAAAAID%2FABMSqAfj%2FsLmvAAAAABJRU5ErkJggg%3D%3D" alt="" />

Получается вот что:

Недостаток: не работает в IE до версии 8.

2 Конвертация картинки в HTML

Метод для особых извращенцев, но работает даже в IE. Суть — картинка конвертируется в набор HTML-тегов, которые при визуальном формировании в браузере выглядят как исходное изображение. Вот пример. Но такая конвертация, наверное, может занять больше времени чем чтение из базы)

sedov.alx

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

Так картинка и так в отдельном поле хранится.

Чак Норрис

Ну тогда можно и обычный HttpHandler использовать. Не очень красиво архитектурно, но работать будет)

sedov.alx

Ну, то есть внешний словарь [id, картинка];, который заполняется, скажем, в RenderWebPart. Там же формируется html-содержимое на выход, в котором используются обычные теги <img src="photo.aspx?id=10">. Затем в HttpHandler'е лезем в заполненный словарь и вытаскиваем оттуда бинарные данные картинки. Так?

Чак Норрис

Можно так. А можно брать не из словаря а напрямую из базы. Из словаря, конечно, будет быстрее, но будет заниматься память и еще придётся держать синглтон, для хранения этого словаря. Также метод RenderWebPart вызывается каждый раз при обновлении страницы, поэтому словарь должен быть потокобезопасным.

sedov.alx

Да просто не хотелось бы в базу лезть так часто

Sergey

Можно сделать сохранение картинки во временную папку на диске. И время от времени очищать.


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.