【问题标题】:How to pass binary image to image handler to display it in DataList?如何将二进制图像传递给图像处理程序以在 DataList 中显示?
【发布时间】:2012-10-12 09:01:07
【问题描述】:

我有一个网页,其中调用了在DataList 控件中显示一些图像的方法

MyImage.cs

class MyImage
{
    string Name { get; set; }
    byte[] Jpeg { get; set; } 
}

MyImages.aspx.cs

public void DisplayMyImages(IEnumerable<MyImage> myImages)
{
    this.myImagesDataList.DataSource = myImages;
    this.myImagesDataList.DataBind();  
}

/// ...

protected void myImagesDataList_ItemDataBound(object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
        MyImage myImage = (MyImage)e.Item.DataItem;
        Image myImageImage = (Image)e.Item.FindControl("myImageImage");

        // How to pass myImage.Jpeg to ImageHandler? form here

        myImageImage.ImageUrl = "~/Handlers/ImageHandler.ashx";
    }
}

但是如果已经从数据库中提取并传递给DisplayMyImages()函数,如何将jpeg图像传递给ImageHandler

备注:

我不想将它们保存回文件并将查询字符串中的路径传递给ImageHandler

无法使用标准查询字符串方法,因为我不想违反模型视图演示者方法

【问题讨论】:

    标签: c# asp.net image httphandler


    【解决方案1】:

    通常图像应该由 ImageHandler 生成而不是传递给,所以只需翻转你的逻辑。 你最终会得到这样的结果:

    myImageImage.ImageUrl = "~/Handlers/ImageHandler.aspx?id=yourImageId";
    

    确保设置正确的内容类型,如下所示:

    context.Response.ContentType = "image/png";
    

    这就是您编写图像以响应的方式:

    byte[] fileData = null;
    //TODO: load your image data into fileData!
    context.Response.BinaryWrite(fileData);
    

    【讨论】:

    • 我知道通过查询字符串传递 id 是常用的方法,但在模型视图中,演示者视图提供了数据,更糟糕的是,将与视图无关的图像处理程序与演示者耦合
    • 您没有从数据源获得的图像数据提供的某种唯一 ID 吗?
    • 数据已被提取。我正在寻找将图像数据传递给图像处理程序的替代方法。将图像处理程序耦合到演示者将需要某些修改,这可能是不可能的
    【解决方案2】:

    传入图像的 ID 并在需要时直接从数据库中检索它并使用类似于 ;

    var data = //Code to retrieve byte[];
    
    int len = data.Length;
    response.ContentType = "image/png";
    response.BinaryWrite(data);
    

    【讨论】:

    • 在我的模型视图展示器架构的情况下是不可能的
    • 添加一个 ID 并将其传递给一个专用的处理程序可能是您可以使用的唯一选项,并且在我看来(以及这里的其他人似乎)将是最好的方法.在查询字符串中传递图像数据的唯一其他选项,在这种情况下您可能会遇到查询字符串长度问题。
    • 图像处理程序的会话或公共属性怎么样?我不能使用带有查询字符串的图像处理程序,因为图像数据已经从数据库中提取
    • 我还要补充一点,将 ID 添加到您的图像类并适当地使用它不会破坏任何架构。如果是这样,那么它不适合您的应用程序。
    • 我需要在不使用查询字符串的情况下将数据传递给图像处理程序
    【解决方案3】:

    首先我认为你可能会出错

    myImageImage.ImageUrl = "~/Handlers/ImageHandler.aspx";    
    

    注意:您需要将 ImageHandler 文件包含在 .ashx 而不是 .aspx 文件中。 .ashx Generic Handler 在从 ImageHandler 检索图像时用作上下文中的图像。这是 ImageHandler 文件的正确格式。

    imgProfile.ImageUrl = "ImageHandler.ashx?imgid=" + imageId.ToString();
    

    click here to see complete referece.

    希望,它可以帮助你。 !!

    【讨论】:

    • 我实际上使用 ashx 只是打错了它。模型视图展示器中无法将图像处理程序耦合到服务以使用查询字符串提取图像
    • 哦,没关系。看看这个例子 (farazkhanhighoncsharp.blogspot.in/2011/04/…)
    • 是的,通用 aspx 处理程序,我认为我们唯一的解决方案是将图像保存到文件并设置 url
    • 但问题是在我设置 ImageUrl 后我的 aspx 处理程序没有被调用
    【解决方案4】:

    我刚刚回答了your question on CodeProject,但我也将答案复制到这里。

    根据图片的大小以及需要支持的浏览器,您可能可以使用data URI

    myImageImage.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(myImage.Jpeg);
    

    (如果您使用的是 IE8,则限制为 32Kb;根本不支持早期版本的 IE。)

    【讨论】:

    • 虽然我发现将图像保存到磁盘并将 url 分配给图像控件更容易
    • 你的方法真是别出心裁!我一直在努力将会话与 http 处理程序一起使用,然后我求助于将图像保存到磁盘并提供链接,但你的却截然不同!
    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多