20 Апрель 2024, 09:31:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости:
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подтягиваем картинки из DB (ASP.NET)  (Прочитано 16429 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BARBOSS
Постоялец
***

Бонус: +0/-0
Offline Offline

Сообщений: 64


We Live In Peace


Просмотр профиля
« : 08 Декабрь 2008, 20:34:41 »

Недавно, при девелопменте одного проекта, предо мной стал вопрос где и как хранить картинки? Сходил в гугл, почитал - пишут что в базе хранить картинки не очень хорошо, забиваетсо база, другие же пишут администрировать/программировать значительно проще когда они в базе. Короче я подумал и решил положить в базу все имаги т.к. проект был типа Системы новостей - имаги там не большого объема и мне буит так проще с ними разобратсо.
Положил я их в базу как битовый аррэй, а потом задумался - "Этож сколько кодяры надо написать чтоб их оттудова вытянуть?". Пошел опять в гугл и обнаружил там такое средсво ASP.NET как хендлер, хорошо что мелко-мягкие дали возможность простому смертному девелоперу писать свои хендлеры.
И нашел еще имплементацию. Далее представлю пример, мало ли кому пригодится, вещь - хорошая.


В форуме достаточно часто поднимается вопрос типа «а как отобразить картинку, если она сохранена в БД?». И ответ всегда звучал примерно так: «создать файл, который получает картинку из БД и пишет ее содержимое клиенту предварительно установив правильный 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;
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/Articles/Article/20.html)
« Последнее редактирование: 08 Декабрь 2008, 20:42:58 от BARBOSS » Записан

spyplane
Советник
Старожил
*****

Бонус: +0/-0
Offline Offline

Сообщений: 267


Жмай те говорят!


Просмотр профиля
« Ответ #1 : 09 Декабрь 2008, 03:36:02 »

а почему не хранить просто на сервере???
Записан

Чукча не писатель, чукча читатель...
Прораб
Комментатор
******

Бонус: +2/-0
Offline Offline

Сообщений: 579


Сомневающийся


Просмотр профиля WWW
« Ответ #2 : 09 Декабрь 2008, 06:05:04 »

В базе данных лучше хранить название картинки, а саму картинку на сервере. Так при больших посещениях не будет загружаться сервер для обработки онных.
Записан

(http://viejochoto.com.ar)
Жизнь ударяет Вас в лоб только тогда, когда Вы не замечаете ее пинков под зад
BARBOSS
Постоялец
***

Бонус: +0/-0
Offline Offline

Сообщений: 64


We Live In Peace


Просмотр профиля
« Ответ #3 : 14 Декабрь 2008, 17:35:22 »

я с вами согласен... Эт так столкнулся просто мало кому пригодиться!
« Последнее редактирование: 22 Июнь 2009, 09:16:13 от LocK » Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.9 | SMF © 2006-2008, Simple Machines LLC