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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите полному чайнику, HttpHandler 
V
    Опции темы
shark1
Дата 8.4.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемые помогите полному чайнику.Нашол 3 примера(
1)http://forum.vingrad.ru/forum/topic-204935.html;
2)http://forum.vingrad.ru/forum/topic-153414/unread-1/kw-asp-image-mssql/hl/ashx/index.html;
3)http://forum.vingrad.ru/topic-204935.html)
 уже казалось бы что проще,и вроде примеры не трудные и вроде написано все доступно,но я баран не могу ни как сделать smile  :( ,вроде всё делаю как написано и нехрена не получается.Пожалусто если не трудно помогите чаынику,киньте плизз,один примерчик с db(access)если можно чтоб я наглядно увидел ну как же блин достаются фотографии из db с помощью HttpHandler.Зарание огромное спасибо.
PM MAIL   Вверх
Mymik
Дата 8.4.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

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



давай лучше разберемся что у тебя не работает? ты наверное хочешь отлавливать html с помощью IIS а у тебя не добавлено правило перехвата html расширения... smile


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
shark1
Дата 9.4.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Давай Mymik ты мой спаситель.С чего начать.сделал как в этом примере(http://forum.vingrad.ru/forum/topic-153414/unread-1/kw-asp-image-mssql/hl/ashx/index.html)
создал Default.aspx.В Default.aspx.cs:
Код

using System;
using System.Data;
using System.Configuration;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Data.OleDb;
using System.Web.Configuration;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
        //int ID = Convert.ToInt32(Request.QueryString["ID"]);
        //GetFotoFromDB(ID);
        public static Stream GetFotoFromDB(int ID)
        {
            string connectionString = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Storage_DB.mdb"))
                //using (OleDbConnection connection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Storage_DB.mdb")
                {
                    connection.Open();
                    OleDbCommand command = new OleDbCommand("SELECT [Photo] FROM [ItemsNumber] WHERE [ID] = @ID", connection);
                    // создаеш свой ридер для побайтового чтения картинки
                    OleDbDataReader 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(OleDbDataReader 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;
            }
        }
    }

Сдесь private static Stream GetImageStream(OleDbDataReader reader)выдаёт ошибку:
Default.GetImageStream(System.Data.OleDb.OleDbDataReader)': not all code paths return a value    
Создал GetFoto.ashx.
Код

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.IO;
using System.Web;
using System.Web.Services;

[System.Web.Services.WebService(Namespace = "http://tempuri.org/")]
[System.Web.Services.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;
        }
    }
}

Сдесь using (Stream DBstream = GetFotoFromDB(ID))выдаёт ошибку:
'GetFotoFromDB' does not exist in the current context.
В общем все очень плохо :( :(.    
PM MAIL   Вверх
Mymik
Дата 9.4.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

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



Цитата(shark1 @  9.4.2008,  09:23 Найти цитируемый пост)
Сдесь using (Stream DBstream = GetFotoFromDB(ID))выдаёт ошибку:
так ведь метод не определен... оно и должно выдавать ошибку, мол такого метода нет... ты добавить этот метод в ashx Файл...

Цитата(shark1 @  9.4.2008,  09:23 Найти цитируемый пост)
Сдесь private static Stream GetImageStream(OleDbDataReader reader)выдаёт ошибку:
Default.GetImageStream(System.Data.OleDb.OleDbDataReader)': not all code paths return a value    
 Все точно так же. У тебя там два if стоит и делает return только второй if а если ни один из if'ов не сработает? так что в конце метода поставь return new MemoryStream();



--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
shark1
Дата 9.4.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Mymik извени за глупый вопрос ,а как и куда добавить этот метод в ashx.  smile 
PM MAIL   Вверх
login26
Дата 9.4.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



shark1  держи пример все работает только в веб конфиге коннект подправь


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  primer.zip 21,42 Kb
PM MAIL   Вверх
shark1
Дата 9.4.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



login26 спасибо огромное всё работает,и в добавок такой вопрос,в примере есть только  одно фото с id=2,а как например добавить если в базе много картинок и каждая должна быть на своём месте(например в таблице,например так:
<asp:Image ID="Foto" runat="server" BorderWidth="0px" ImageUrl="~/GetFoto.ashx?id=1" />;)где каждый id соответствует id в базе и тогда можно будет подставлять нужное фото в нужное место,как быть,а неподскажеш всетаки как сделать этот недосягаемый (для меня  smile )HttpHandler кот.должен доставать картинки из базы.Еще раз спасибо.
PM MAIL   Вверх
login26
Дата 11.4.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



shark1  держи пример версия 1.2  smile 


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  primer.zip 27,93 Kb
PM MAIL   Вверх
shark1
Дата 11.4.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



login26 сапсибо большое за пример,но я чють чють о другом спрашивал,как прикрутить базу к datagrig это понятно,вопрос в другом,ну например на странице имеется table(3x3) + PlaceHolder + Image.И как мне например в нужное место в таблице вставить фото,затем в PlaceHolder вставить нужное фото и в Image тоже вставить своё фото.Вот с чем проблема.Зарание огромное спасибо.
PM MAIL   Вверх
Optimus
Дата 11.4.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.Data.OleDb;
  
// ...  
  public void ProcessRequest (HttpContext context) 
  {
    int id = Convert.ToInt32(context.Request.QueryString["id"]);

    using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Storage_DB.mdb"))
    {
      OleDbCommand command = new OleDbCommand("SELECT [Photo] FROM [ItemsNumber] WHERE [ID] = @ID", connection);
      command.Parameters.AddWithValue("@ID", id);
      byte[] img = null;

      connection.Open();

      try
      {
        img = (byte[])command.ExecuteScalar();
        if (img != null)
        {
          context.Response.ContentType = "image/jpeg";
          context.Response.OutputStream.Write(img, 0, img.Length);
        }
      }
      catch
      {
        context.Response.WriteFile("noimage.jpg"); // Отобразить этот файл если в базе нет картинки  
      }
    }
  }
// ...

Чтобы отобразить картинку с ID = 1
Код

  <asp:Image ID="Image1" runat="server" ImageUrl="~/Handler.ashx?id=1" />

--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
shark1
Дата 12.4.2008, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Optimus спасибо тебе огромное это как раз то что мне было нужно все отлично работает,фото видно отлично.Спасибо. smile 
А можно еще вопрос.В этой же базе есть поле Remarks(соответственно у каждой картинки),как например в одно поле добовлять фото а в другое её Remarks.Еще раз спасибо.
PM MAIL   Вверх
Optimus
Дата 12.4.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Допустим у нас есть таблица Images со столбцами ID, Image, Remarks
Код

// ..
using System.Data.OleDb;
using System.IO;
// ...

private void Insert(int id, string imageURL, string remarks)
{
  byte[] imageData = GetImage(imageURL);

  string connectionString = ""; // тут пишите строку соединения
  // тут, если нужно, меняете имя таблицы и/или имена столбцов 
  string commandString = String.Format("INSERT INTO Images(ID, Image, Remarks) values('{0}', @Image, '{1}')", id, remarks);
            
  using (OleDbConnection connection = new OleDbConnection (connectionString))
  {
    OleDbCommand command = new OleDbCommand (commandString, connection);
    command.Parameters.AddWithValue("@Image", (object)imageData);

    connection.Open();

    command.ExecuteNonQuery();
  }
}

private byte[] GetImage(string imagePath)
{
  byte[] data = null;

  FileInfo fInfo = new FileInfo(imagePath);
  long numBytes = fInfo.Length;

  FileStream fStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read);

  BinaryReader br = new BinaryReader(fStream);

  data = br.ReadBytes((int)numBytes);

  return data;
}

Теперь можно добавлять в таблицу, например так:
Код

// ...
  Insert(10,  @"D:\1.jpg", "remarks")
// ...


P.S. Один топик - один вопрос!
ИМХО, этот вопрос больше к ADO.NET относится

Это сообщение отредактировал(а) Optimus - 12.4.2008, 16:52
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
shark1
Дата 13.4.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Optimus спасибо тебе огромное,но как это делается на ADO.NET (wind. апликации) я знаю,а меня интересует как это сделать на ASP.Net.В твоём примере вот так(<asp:Image ID="Image1" runat="server" ImageUrl="~/Handler.ashx?id=1" />) добовляется картинка на страницу(из базы),а как к этой же картинки добавить на страницу её remarks в соседную ячейку.Спасибо огромное.
PM MAIL   Вверх
Optimus
Дата 13.4.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно сделать, например, так:
Код

  <asp:Image ID="Image1" runat="server" />
  <asp:Label ID="Label1" runat="server"></asp:Label>

Код

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    DisplayImageAndRemarks(Image1, Label1, 1);
  }
}

protected void DisplayImageAndRemarks(Image image, Label label, int id)
{
  image.ImageUrl = "~/Handler.ashx?id=" + id;

  using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Storage_DB.mdb"))
  {
    OleDbCommand command = new OleDbCommand("SELECT [Remarks] FROM [ItemsNumber] WHERE [ID] = @ID", connection);
    command.Parameters.AddWithValue("@ID", id);

    connection.Open();

    try
    {
      label.Text = (string)command.ExecuteScalar();
    }
    catch
    {
      label.Text =  "No Remarks"; // Отобразить если в базе нет
    }
  }
}

Чтобы поменять картинку и  Remarks для ID = 2
Код

// ...
  DisplayImageAndRemarks(Image1, Label1, 2);
// ...

--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
shark1
Дата 14.4.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемый Optimus спасибо вам что вы не оставляете без внимания мой топик.Почему то Insert не срабатывает,на вот этой строке:long numBytes = fInfo.Length;
пишет что фаил С:\1.jpeg  не найден.(System.IO.FileNotFoundException: Could not find file 'C:\1.jpeg'.
).Подскажите а как сделать красиво и удобно для usera через FileUpload,чтоб пользователь имел возможность выбрать фото на диске,добавить какой нибудь remarks и сохронить это все в базе.Зарание огромное спасибо. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

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

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

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


 




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


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

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