dotSITE
Учебник по ASP.NET Форумы Work in Murano Software.
новости материалы решения форумы группы настройки/о проекте
Назад

Как отобразить картинку из Базы Данных?

Существует несколько способов решения данного вопроса.

Один из них – это написать отдельную .aspx страницу, для получения изображения. Получение изхображения и его вывод на экран будем производить в методе Page_Load.

void Page_Load(object sender, EventArgs e) 
{
  //Получаем значение идентификатора картинки
  int id = Int32.Parse(Request.QueryString["ID"]);
  //Создаем подключение к БД 
  using (SqlConnection myConn = new SqlConnection("server=Server;database=Images;User Id=sa;Password=asdasd;")) 
  { 
    //и получаем картинку по ее идентификатору
    SqlCommand myCmd = new SqlCommand("select ImageBody from Image where ImageId = @id", myConn);
    myCmd.Parameters.Add("@id", id);
    myConn.Open();
    using(SqlDataReader rdr = myCmd.ExecuteReader() ) 
    {
      // Проверка на существование записи
      if (rdr.Read()) 
        // пишем содержимое картинки клиенту.
        Response.BinaryWrite(rdr.GetSqlBinary(0).Value);
    }//DataReader уничтожен
  }//Подключение к БД закрыто
}

Теперь, с любой другой страницы вывести картинку с ID равным 20 можно с помощью html тэга:

<IMG src="pic.aspx?ID=20">

Второй способ заключается в использование HttpHandler. HttpHandler это фильтр, обрабатывающий http запросы. Любой запрос, приходящий на ASP.NET приложение, будет обработан одним из HttpHandler. Для того чтобы написать собственный HttpHandler, у класса необходимо реализовать интерфейс IHttpHandler.

namespace ViewImage {
public class Image : IHttpHandler
{
  public Image()
  {    
  }
  //Свойство, указывающее на то, может ли класс вызываться без повторной инициализации
  bool IHttpHandler.IsReusable 
  {
    get { return true; }
  }

  //Метод ProcessRequest, выполняющий обработку запроса
  void IHttpHandler.ProcessRequest(HttpContext context)
  {
    //Получаем значение идентификатора картинки
    int id = Int32.Parse(context.Request.QueryString["ID"]);
    //Создаем подключение к БД 
    using (SqlConnection myConn = new SqlConnection("server=Server;database=Images;User Id=sa;Password=asdasd;"))
    {
      SqlCommand myCmd = new SqlCommand("select ImageBody from Image where ImageId = @id", myConn);
      myCmd.Parameters.Add("@id", id);
      myConn.Open();
      using(SqlDataReader rdr = myCmd.ExecuteReader() ) 
      {
        // Проверка на существование записи
        if (rdr.Read())
        // пишем содержимое картинки клиенту.
        context.Response.BinaryWrite(rdr.GetSqlBinary(0).Value);
      }}//DataReader уничтожен
    }//Подключение к БД закрыто
  }
}
}

Кроме этого, необходимо зарегистрировать HttpHandler в файле web.config. Существует и другой способ, но о нем чуть ниже. Подключение HttpHandler производится при помощи параметра «httpHandlers», формат которого приведен ниже.

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

В нашем случае запись в web.config выглядит следующим образом:

<httpHandlers>
  <add verb="*" path="image.aspx" type="ViewImage.Image, ViewImage"/>
</httpHandlers>

Теперь при любом запросе файла image.aspx (реально файл не существует) обрабатывать этот запрос будет HttpHandler, код которого приведен выше. Для того чтобы вывести картинку с ID равным 13 можно использовать следующую строку:

<img src=”image.aspx?id=13”>

Существует еще один способ, который позволяет не регистрировать HttpHandler в web.config. Для этого необходимо создать файл с расширением ashx. Назавем его foto.ashx. Содержать же он будет всего одну строчку:

<%@ WebHandler class="ViewImage.Image, ViewImage" %>

Для отображения картинки с ID равным 15 при помощи данного способа, можно использовать следующую строку:

<img src="foto.ashx?id=15">

 Назад
Контакт Реклама на сайте Спонсорам Веб мастерам

Лицензионное соглашение - © 2000-2012 dotSITE
Хостинг .NET предоставлен PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development