GetInfo.Ru – Компьютерная библиотека
Последние поступления
Как выбрать систему управления базы данных
Базы данных03/09/14
Этапы загрузки UNIX (в схеме)
Unix27/03/12
Gatewall Antispam: тотальный контроль электронной почты
Спам21/04/11
Мастер-класс: создаем Интернет-магазин (Часть 1)
Обзоры ПО20/04/11
CorelDRAW Graphics Suite X5: Что нового?
Обзоры ПО20/07/10
Добавить статью
Самые читаемые материалы
Программирование на ASP. Введение или первый урок.(15822)
Отображение картинки из БД напрямую - создание своего HttpHandler(13327)
Использование шаблонов дизайна в ASP .NET(12392)
Кеширование ASP.NET страниц(11646)
Пакетная компиляция в ASP.NET(11387)
Всего статей: 793Всего авторов: 364Подразделов: 47Добавлено за сутки: 0
Статьи  СТАТЬИ Форум  ФОРУМ Рейтинг  РЕЙТИНГ Поиск  ПОИСК Контакты  КОНТАКТЫ
» Главная » ASP » Отображение картинки из БД напрямую - создание своего HttpHandler

Отображение картинки из БД напрямую - создание своего HttpHandler


Dimon aka Manowar
aspnetman@aspnetmania.com
http://www.aspnetmania.com/

В форуме достаточно часто поднимается вопрос типа <а как отобразить картинку, если она сохранена в БД?>. И ответ всегда звучал примерно так: <создать файл, который получает картинку из БД и пишет ее содержимое клиенту предварительно установив правильный ContentType>.

Но зачем использовать дополнительный файл для получения картинки, если в ASP.NET есть такое замечательно средство обработки запросов, как HttpHandler? :)

Что же такое HttpHandler и на что он похож? Фактически HttpHandler это тот же ISAPI фильтр, обрабатывающий http запросы. Любой запрос, приходящий на ASP.NET веб приложение, в итоге будет обработан одним из HttpHandlerов, и от этого никуда не деться. Некоторые HttpHandlerы передают выполнение запроса другим классам (например классу вызываемой страницы), другие же сами обрабатывают запрос и возвращают результат клиенту. Но это в данном случае не суть важно. Важно то, что Microsoft предоставила возможность разработчикам с легкостью писать свои HttpHandlerы.

Продолжим рассмотрение нашей задачи - получения изображения из базы данных. Пусть в БД есть таблица Picture следующей структуры:

CREATE TABLE pictures (
	id	int	IDENTITY(1,1) NOT NULL ,
pic	image 	NOT NULL 
) 

Мы хотим получать из этой БД изображение по его уникальному идентификатору (значению поля id). При это мы не хотим создавать никаких дополнительных файлов. И, как я уже упоминал, этого и не потребуется - все может быть сделано с помощью HttpHandler.

Для того, чтобы класс мог быть зарегистрирован как HttpHandler, необходимо всего лишь реализовать в нем интерфейс System.Web.IHttpHandler, имеющий одно get свойство и один метод. Попробуем сделать это :)

Начнем с имени класса:

namespace PictureHandler
{	public class PictureHandler : IHttpHandler
	{

Затем реализуем свойство IsReusable, указывающее на то, может ли наш класс вызываться без повторной инициализации

	bool IHttpHandler.IsReusable 
	{
	get { return true; }
	}

И, наконец, перейдем к самому интересному - реализации метода ProcessRequest, выполняющего реальную обработку запроса. Напомню, что мы хотим по уникальному идентификатору картинки вернуть саму картинку:

	void IHttpHandler.ProcessRequest(HttpContext context)
	{

Получаем ссылки на объекты Request и Response запроса.

	HttpRequest Request = context.Request;
4	HttpResponse Response = context.Response;

Получаем значение уникального идентификатора картинки

	int ID = Int32.Parse(Request.QueryString["ID"]);

Создаем подключение к БД и получаем картинку по ее уникальному идентификатору

	SqlConnection myConn = new SqlConnection("server=localhost;uid=sa;pwd=;database=pictures");
	SqlCommand myCmd = new SqlCommand("select pic from pictures where id = @id", myConn);
	myCmd.Parameters.Add("@id", empID);
	myConn.Open();
	SqlDataReader rdr = myCmd.ExecuteReader();

Я здесь не делал проверки на существование записи, но в реальной жизни это конечно же не помешает :)

	rdr.Read();

Устанавливаем правильный ContentType

	Response.ContentType = "image/jpeg";

И пишем содержимое картинки клиенту.

	Response.OutputStream.Write(rdr.GetSqlBinary(0).Value, 0, rdr.GetSqlBinary(0).Length);
	Response.End();
	rdr.Close();
	myConn.Close();
	}
	}
}

Вот и все - наш HttpHandler создан. Осталось подключить его к веб приложению и он будет готов к работе.

Для подключения HttpHandlerов используется секция <httpHandlers> файла конфигурации web.config. Формат строки подключения HttpHandlerа следующий:

<httpHandlers>
    <add verb="(verbs)" path="(путь к файлу)" type="(полное имя класса,имя сборки)" />
</httpHandlers>

Опираясь на это подключим созданный нами HttpHandler к веб приложению. Перепишем скомпилированную сборку в подкаталог bin веб приложения и добавим в файл конфигурации в раздел <httpHandlers> следующую строку:

<add verb="*" path="photo.aspx" type="PictureHandler.PictureHandler,PictureHandler" />

Человеческим языком эту строку можно объяснить так: при запросе файла photo.aspx обрабатывать это запрос HttpHandlerом PictureHandler.PictureHandler, находящимся в сборке PictureHandler. Обратите внимания - реально файла photo.aspx в веб приложении не существует, но если вы попробуете запросить файл photo.aspx с правильным уникальным идентификатором картинки - вам будет возвращена эта картинка.

Вот и все. Теперь в любом месте веб приложения для вывода картинки с id=10 можно использовать <img src="photo.aspx?id=10">.

PS. Не пытайтесь используя приведенный выше пример получить картинки из таблицы Employees базы Northwind - все равно ничего не получится :) В этой таблице хранятся не картинки, а OLE объекты.

Оригинал статьи: http://www.aspnetmania.com/

 
11.02.2003
Версия для печати Версия для печати Запомнить ссылку Запомнить ссылку
Ваша оценка:  1   2   3   4   5     

 О проектеПерепечаткаАвторамПартнерыО нас пишут
Наверх
©2003—2007. GETINFO.RU. ВСЕ ПРАВА ЗАЩИЩЕНЫ.