【问题标题】:HTTPHandler write Binary Data to Response , load imageHTTPHandler 将二进制数据写入响应,加载图像
【发布时间】:2011-09-28 20:15:19
【问题描述】:

iv'e 有一个中继器绑定到实体列表

    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 对象中,我将图像写入响应 响应只发生一次,因此只有最后一张图片被写入(全部)用户控件。

     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);
     }

知道如何为每个单独的控件编写二进制数据

提前致谢 伊兰

【问题讨论】:

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


    【解决方案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。你不需要它。

    【讨论】:

    • 当我将编码字节保存到具有正确扩展名的文件中并将其添加为 src 属性时,我实际上尝试了类似的方法,谢谢,我再试一次
    • 这似乎不起作用......你从哪里得到转换字符串。我不认识语法
    • @eranotzer 效果很好:msdn.microsoft.com/en-us/library/dhx0d524.aspx Convert.ToBase64String 接受 byte[] 并返回 Base64 编码的字符串。检查我的 MSDN 文档链接。我用过,所以引用它。
    • 是的,我意识到这可以工作,我正试图找到问题的根源,因为我的图像没有显示,我看看你的链接。谢谢。请检查我的编辑。
    • 我查看了 msdn 中的内容,我仍然想知道您在哪里使用了语法“\data:image/jpg;base64,"......所以我可以检查是否有该语法有问题,因为它不显示图像,我知道 base64bitstring 表示它很好,但可能附件错误..
    【解决方案2】:

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

    【讨论】:

    • 我想到了这一点,但是当我已经获得了所有会降低性能的信息和图像时,我将不得不为每个图像访问我的数据库......
    • 解决方案是不将图像数据与产品一起返回,方法是将其从对象中排除或延迟加载。这种方法的好处是允许您为图像返回 304,因此不会每次都下载它们。
    • 我真的不知道 304 是什么。也许您可以向我推荐一个很好的来源,看看如何使用它们?
    • 看看我的回答stackoverflow.com/questions/7410357/…。基本上,您检查文件自上次由浏览器下载后是否已更改,如果没有,则告诉它不要下载文件
    【解决方案3】:

    总结一下,对于这种情况,我认为最佳做法是@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;
           }       
    

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 2021-10-21
      • 1970-01-01
      • 2017-06-03
      • 2010-10-27
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多