Существует несколько способов решения данного вопроса.
Один из них – это написать отдельную .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">