我有一个HTTP处理程序,它从数据库返回存储为VARBINARY(MAX)
的图像。 ImageURL
中的Repeater
属性设置为:
ImageUrl='<%# "~/ImageHandler.ashx?PictureId=" + Container.DataItem.ToString() %>'
有效。但是,这段代码的真正问题是页面的Page_Load
方法从数据库中返回“PictureId”列表,然后`ImageHandler.ashx'使分开,单独调用到每个图像的数据库。这只是往返DB的过多次。
我正在寻找一种方法来一次性获取所有图像并将其显示在Repeater
中。在我意识到没有可用的缓存之前,将图像转换为Base64似乎是一个可行的选择。我怎么能这样做?我很适合使用HTTP处理程序完成工作,但它必须一次性完成。有什么想法吗?
答案 0 :(得分:1)
嗯,您正在使用的方法是在您使用PictureId获取数据库中的每个独特图像时,在每次通话时给您相同的结果。
方法-1。
为了实现您的关注,您可以做的是首先访问数据库并从数据库获取所有图像并保留在通用列表中。现在从该通用列表解析图像并提供给转发器。
方法-2。我没有尝试过代码,但我希望它可以让你知道如何获得你想要的东西。
用于在转发器控制中显示图像:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ConnectionStrings:ConnectionString %>" SelectCommand="SELECT Image FROM Images">
</asp:SqlDataSource>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" OnItemDataBound="Repeater1_ItemDataBound">
<itemtemplate>
<asp:HiddenField Value='<%# Eval("id") %>' ID="HiddenField1" runat="server" />
<asp:Image ID="Image1" runat="server" />
</itemtemplate>
</asp:Repeater>
和aspx.cs
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
HiddenField hf = e.Item.FindControl("HiddenField1") as HiddenField;
if (hf != null)
{
string val = hf.Value;
Image img = e.Item.FindControl("Image1") as Image;
img.ImageUrl = string.Format("data:image/jpg;base64,{0}",val);
}
}
注意:您无法使用HTTP处理程序根据PictureId获取一次点击中的所有图像。
<强> Edited-&GT; 强>
除了您的缓存问题之外,事实是,如果您的服务器上没有实际存在的图像(用于浏览器的HTTP资源),则无法通过Web浏览器提供缓存。你能做的是 1)使用客户端脚本通过构建API从服务器调用图像 2)或使用Base64转换,因为虽然它会增加带宽利用率,但没有其他选择
您基本上将两个不同的问题合二为一。因为克服多个请求的HTTP Handler是一种情况,提供缓存是另一种情况。
对于Web浏览器缓存功能您应该在您的Web服务器上存在http资源(图像文件),但如果您关注性能然后替换缓存,您可以使用某种压缩机制压缩您的图像,它将节省您页面的一些带宽和加载时间。这是一个很好的read。评论这是否仍然没有帮助或标记为答案。