HTTPHandler записывает двоичные данные в ответ, загружает изображение - PullRequest
0 голосов
/ 26 сентября 2011

iv'e получил ретранслятор, связанный со списком объектов

    BL_Engine engine = (BL_Engine)Application["engine"];
    List<AppProduct> products = engine.Get_Products();
    Repeater1.DataSource = products;
    Repeater1.DataBind();

iv'e также получил пользовательский элемент управления, который я использую для представления этих объектов продукта, я делаю это, переопределяя Databind () впользовательский элемент управления:

    public override void DataBind()
    {
        AppProduct product = (Page.GetDataItem() as AppProduct);
        lbl_title.Text = product.Title;
        lbl_short.Text = product.Short;
        lbl_date.Text = product.Date.ToShortDateString();                       
        Session["current_img"] = product.Image1;            
        base.DataBind();
    }

в моем объекте HttpHanlder, хранящемся в файле .ashx. Я записываю изображение в ответ, ответ происходит только один раз, поэтому только последнее изображение записывается (ВСЕ) в пользовательские элементы управления.

     public void ProcessRequest(HttpContext context)
     {
        byte [] image = (byte[])context.Session["current_img"];                  
        context.Response.ContentType = "image/bmp";
        context.Response.OutputStream.Write(image, 0, image.Length);
     }

любая идея, как я мог бы записать двоичные данные для каждого отдельного элемента управления

заранее спасибо, Эран.

Ответы [ 3 ]

1 голос
/ 26 сентября 2011

Позвольте мне предложить другой подход.

Объявите регулярный HTML-элемент изображения в вашем элементе управления и установите свойство "runat = server" следующим образом:

<img src="" runat="server" id="img_product" />

Затем измените ваш DataBind() метод, чтобы сделать это вместо:

 public override void DataBind()
 {
       AppProduct product = (Page.GetDataItem() as AppProduct);
       lbl_title.Text = product.Title;
       lbl_short.Text = product.Short;
       lbl_date.Text = product.Date.ToShortDateString();                       
       img_product.src= "\"data:image/jpg;base64,"+System.Convert.ToBase64String(product.Image1)+"\"";
        base.DataBind();
 }

И избавиться от HTTPHandler. Вам это не нужно.

1 голос
/ 26 сентября 2011

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

0 голосов
/ 27 сентября 2011

хорошо, чтобы заключить, для этого случая я думаю, что лучшей практикой будет ответ @ icarus, а не игнорирование ответа @ kmcc049, который я просто не вникнул в него, поскольку это выглядело как более сложная архитектура для моего приложения.

в этом случае DROP THE HTTPHANDLER.

Я сохранил тип изображения и данные из почтового файла.

        public enum ImageType : byte {jpg,jpeg,png,gif}  

        private byte[] Get_Image(HttpPostedFile file)
        {
            ImageType type = GetType(file.ContentType); 
            if (file.InputStream.Length <= 1)
                return null;
            byte[] imageData = new byte[file.InputStream.Length + 1 + 1];
            file.InputStream.Read(imageData, 1, imageData.Length+1);
            imageData[0] =(byte)type;
            return imageData;
         }

         private ImageType GetType(string _type)
         {
            ImageType t = default(ImageType); 
            string s = _type.Substring(_type.IndexOf('/')+1).ToLower() ;
            switch (s)
            {
                 case "jpg": t = ImageType.jpg;
                      break;
                 case "jpeg": t = ImageType.jpeg;
                      break;
                 case "png": t = ImageType.png;
                      break;
                 case "gif": t = ImageType.gif;
                      break;
            }
            return t; 
       }

Затем я извлек и добавил егов пользовательский элемент управления в моем переопределении DataBind (в моем пользовательском элементе управления):

       public override void DataBind()
       {
            AppProduct product = (Page.GetDataItem() as AppProduct);
            img_main.Attributes.Add("src",Build_Img_Data(product.Image1));                        
            base.DataBind();
       }


       private string Build_Img_Data(byte[] imageData)
       {
           ImageType type = (ImageType)imageData[0] ;
           byte[] new_imageData = new byte[imageData.Length - 1];
           Array.ConstrainedCopy(imageData, 1, new_imageData, 0, new_imageData.Length); 
           MemoryStream ms = new MemoryStream(new_imageData);
           string base64String = string.Format("data:image/{0};base64,{1}",type.ToString(),Convert.ToBase64String(ms.ToArray()));
           return base64String;
       }       
...