HTTPHandler将二进制数据写入响应,加载图像

时间:2011-09-26 03:01:55

标签: c# asp.net data-binding user-controls httphandler

我有一个转发器绑定到实体列表

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

我也有一个用户控件来代表这些产品实体,我通过覆盖用户控件中的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();
    }

在保存在.ashx文件中的HttpHanlder对象中,我将图像写入响应 响应仅发生一次,因此只有最后一张图片被写入(ALL)用户控制。

     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 个答案:

答案 0 :(得分:1)

更改处理程序,使其将当前产品的id作为查询字符串参数。在处理程序中,根据参数加载正确的图像数据,然后写入。

答案 1 :(得分:1)

让我提出一个不同的方法。

在控件中声明一个常规的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。你不需要它。

答案 2 :(得分:0)

总而言之,对于这种情况,我认为最好的做法是@ 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;
       }