Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка картинки из БД на веб страницу 
:(
    Опции темы
Drago
  Дата 28.5.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



Приветсвую вас великие программеры )
Ребят такой вопрос. Есть БД MS SQL 2005 в ней хранится картинка (поле типа image), есть aspx страница, на которой все это дело должно отобразится. Страница создается с помощью мастерпэйдж (не знаю важно ли это но все же). Как отобразить картинку на ней? На Codeproject нашел пример с использованием потоков, но он не работает, выдает ошибку при создании экземпляра красса Bitmap

Код

protected void Page_Load(object sender, EventArgs e)
    {       
        MemoryStream ImgStream = new MemoryStream();        
        
        //Load Connection String from Web.config
        ...

       //Create and open connection
        SqlConnection cn = new SqlConnection();
        cn.ConnectionString = ConnString.ConnectionString;
        cn.Open();

        string strSql = "SELECT Foto1 FROM UsrAd WHERE UserID="+Session["UserID"].ToString().Trim();
        SqlCommand comm = new SqlCommand(strSql, cn);

        SqlDataReader drImage = comm.ExecuteReader(CommandBehavior.CloseConnection);
        
        while (drImage.Read())
        { 
            byte[] image = (byte[])drImage[0];
            ImgStream.Write(image,0,image.Length);
            Bitmap myBitmap = new Bitmap(ImgStream);//здесь выскакивает ошибка ArgumentException
            Response.ContentType = "image/gif";
            myBitmap.Save(Response.OutputStream, ImageFormat.Gif);
        }
        
        ImgStream.Close();
    }


Учитывая что я полный ламер в аспе, да и в С# , мои попытки поискать инфу в инете ни к чему не привели. Часа два уже вожусь с этой ерундой.
Да и еще вопрос. Куда будет помещатся картинка? Ведь для нее нужен контрол, а в котроле img указывается ссылка на файл. В общем у меня в голове полная каша и паника. Помогите плиз.
Заранее спасибо
PM MAIL ICQ   Вверх
SpaceSpace
Дата 28.5.2007, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 3
Всего: 10



Hi.
Можешь поступить следующем образом (кстати путь очень правидьный и логичный, по моему мнению)

1.  а в аспе странички ставиш контрол картинки
В ImageUrl указываешь путь к твоему HttpHandler, который будет самоотверженно доставать тебе
картинки из базы

Код

<asp:Image ID="Foto" runat="server" BorderWidth="0px" ImageUrl="~/GetFoto.ashx?id=-1" />


2. Делаеш ПРАВИЛЬНЫЙ запрос к базе, который будет тебе возвращать картинку

Код


        public static Stream GetFotoFromDB(int ID)
        {

                using (SqlConnection connection = тут твой коннекшн)
                {
                    connection.Open();
                    command = new SqlCommand(тут твой комманд, connection);
                    // создаеш свой ридер для побайтового чтения картинки
                    SqlDataReader reader = command.ExecuteReader();
                    // это твоя будущая картинка
                    Stream stream = null;
                    try
                    {
                       // как ты получаешь поток будет показано ниже
                        stream = GetImageStream(reader);
                    }
                    // если вдруг что - то ничего :)
                    catch (Exception exception)
                    {
                        stream = Stream.Null;
                    }
                    // ну и есессно закрываем все что открыли
                    finally
                    {
                        connection.Close();
                        reader.Close();
                    }
                    // ура, это твоя картинка
                    return stream;
                }
        }


 /// Побайтно считывает из SqlDatareader в поток
        private static Stream GetImageStream(SqlDataReader reader)
        {
            const int BUFFER_SIZE = 1024;
            //проверяем, есть вообще в ридере что-нибудь
            if (!reader.HasRows)
            {
                throw new Exception("Нет ничего");
            }

            if (reader.Read())
            {
                byte[] buffer = new byte[BUFFER_SIZE];
                // суда будем засовывать твою картинку из ридера
                MemoryStream ImageStream = new MemoryStream();
                int bytesReaded = 0;
                long startByteIndex = 0;
                // цикл до тех пор пока еще можно что-нибуть прочесть
                while (((int)reader.GetBytes( 0, startByteIndex, buffer, 0, BUFFER_SIZE)) > 0)
                {
                                   // сколько байт уже прочитали
                    bytesReaded= (int)reader.GetBytes(0, startByteIndex, buffer, 0, BUFFER_SIZE);
                    // с какого байта начинать потом читать
                    startByteIndex += bytesReaded;
                    // пишем в твой поток кусок картинки
                    ImageStream.Write(buffer, 0, bytesReaded);
                }
                ImageStream.Seek(0, SeekOrigin.Begin);
                return ImageStream;
            }
        }


3. Надо создать веб хандлер http, не пугайся ниче страшного.

Add->NewItem->GenericHandler

после этого действа у тебя в студии появиться

Код

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class GetFoto : IHttpHandler
    {

       // вот в этом методе надо будет достучаться до базы и вытащить картинку
        public void ProcessRequest(HttpContext context)
        {
            // буфер
            const int BUFFER_SIZE = 1024;
            //возвращаем картинку
            context.Response.ContentType = "image/jpeg";
            // тут ID юзера или фото юзера
            int ID;
            //берем айдишник из запроса, который ты будеш подставлять в ImageUrl у <asp:Image />
            try
            {
                ID = int.Parse(context.Request.QueryString["ID"]);
            }
            // если в запросе нет ID, то присваиваем id=-1, на тот случай если вдруг что
            catch
            {
                ID = -1;
            }

            //берем картинку
            using (Stream DBstream = GetFotoFromDB(ID))
            {
                using (Stream stream = DBstream)
                {
                    byte[] buffer = new byte[BUFFER_SIZE];
                    int bytesReaded = 0;
                    //чтение из полученного из базы данных потока
                    while ((bytesReaded = stream.Read(buffer, 0, BUFFER_SIZE)) > 0)
                    {
                       // а это самый концептуальный метод, который собственно
                       // и грузит твою картинку на страничку
                        context.Response.OutputStream.Write(buffer, 0, bytesReaded);
                    }
                }
                context.Response.Flush();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


4. Теперь тебе нужно будет
менять на твоей аспе странице путь к Handler

Foto.ImageUrl = "/GetCover.ashx?ID="+ тут IDшник нужного фото

Вот вроде всё


                                 


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Drago
Дата 28.5.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



SpaceSpace, Спасибо большое за столь подробный и понятный ответ ) Встречу еще препятсвия на своем пути сразу прибегу к вам  smile 
Тему можно считать закрытой )
PM MAIL ICQ   Вверх
retto
Дата 20.4.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 30.10.2007
Где: Кривой Рог, Украи на

Репутация: нет
Всего: нет



хороший пример. но есть вопросик:
как я достучусь с GenericHandler к потокам которые находятся на другой странице?
Цитата

   //берем картинку
            using (Stream DBstream = GetFotoFromDB(ID))

оно же не увидит  "GetFotoFromDB(ID)" smile  или я чтото не так понял?
PM MAIL   Вверх
retto
Дата 20.4.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 30.10.2007
Где: Кривой Рог, Украи на

Репутация: нет
Всего: нет



сделал все как мне кажется проще. Создал файлик Handler.ashx
Код

public class Handler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        HttpRequest Request = context.Request;
        HttpResponse Response = context.Response;
        int ID = Int32.Parse(Request.QueryString["ID"]);

        SqlConnection connection = new SqlConnection("Data Source=RETTO\\SQLEXPRESS;Initial Catalog=Cinema;Integrated Security=True");

        connection.Open();
        SqlCommand command = new SqlCommand("SELECT Рисунок FROM Фильм WHERE [Код фильма]=" + ID + "", connection);
        // создаеш свой ридер для побайтового чтения картинки
        SqlDataReader reader = command.ExecuteReader();
        reader.Read();
        Response.ContentType = "image/jpeg";
        Response.OutputStream.Write(reader.GetSqlBinary(0).Value, 0, reader.GetSqlBinary(0).Length);
        Response.End();
        reader.Close();
        connection.Close();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

регистрировать handler в Web.config ненадо..
и всё... и ссылку на рисунок как говорилось выше.. кода меньше))
PM MAIL   Вверх
uranpro
Дата 9.12.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



retto, Все работает! спасибо всем=)


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Alexb11
  Дата 28.5.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



А как сделать так, чтобы фотография открывалась в другом окне? Ведь нужно передавать ID нужной фотографии? 
PM MAIL   Вверх
A5uKa
Дата 31.5.2010, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 3
Всего: 16



Код

<img src="Handler.ashx?Id=5">

PM   Вверх
Alexb11
  Дата 31.5.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Если знать ID тогда понятно. А если ID менять по нажатию на кнопку с изображением?

PM MAIL   Вверх
A5uKa
Дата 1.6.2010, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 3
Всего: 16



что-то вроде
Код

<img src="Handler.ashx?Id=<% GetID() %>">

?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.1002 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.