我能否在网页中流式传输图像,而不是发送ImageUrl?

3
我有存储在Sql Server数据库中的图像,并希望在网页上显示它们。但是,ASP.NET中的Image控件具有ImageUrl属性,该属性需要一个指向包含图像文件的文件夹的路径。但我要从数据库表中获取我的图像,不想将图像保存到磁盘上以便提供路径。我宁愿直接将图像流传送到页面。我甚至很难想象这一点(双关语),怀疑唯一完成此任务的方法是将图像临时保存到某个位置,然后将其路径化到图像控件。但也许我错过了什么?编辑补充:这是一个会计系统,需要提交差旅费用的收据进行报销。我们考虑允许用户(我们有30,000个用户)扫描他们的收据并与他们的报销请求相关联地存储它们。将其存储在文件系统中可能是一种方法,其中文件系统中的索引存储在Sql Server表中。但是,我被要求查看是否可以在Sql Server中完成此操作,我可以做到这一点,但显示/报告方面非常重要。这些报销请求需要生成报告,我不知道Crystal Reports是否符合进入文件系统的要求。简而言之,在Sql Server中完成此操作将更加容易。

你是否愿意将它们存储在文件系统中而不是 SQL Server 中?从长远来看,这可能会给你带来更好的性能。 - Dax Fohl
如果你真的想要内联图片,请将其转换为数据URI,可以参考以下链接:https://dev59.com/lGw15IYBdhLWcg3wGn9c - Alexei Levenkov
1
可以使用 data: URL 或者使用指向 .ashx 页面的 URL,该页面需要传递一些参数并返回图像。请注意,旧版本的 IE 不支持 data: URI。 - mihi
注意:.ashx文件代表一个处理程序,而不是一个页面。 - John Saunders
2个回答

2

您是否考虑使用数据URI? 数据URI允许您直接将图像等数据嵌入到页面中。 图像被编码为base64格式,并作为HTML中<img>元素的源包含在其中。 您可以在这里了解有关数据URI的更多信息。

如何在C#中执行此操作的详细信息在此问题和答案中有所介绍。最终生成的图像元素看起来像 <img src="data:image/png;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrS"/>

使用数据URI的主要问题是较旧版本的IE不支持或限制图像大小。这里有有关数据URI浏览器限制的文档。


-1
   <img runat="server" 
             src='<%# "getImage.aspx?ID=" + DataBinder.Eval(Container.DataItem, 
             "ImageIdentity")  %>' ID="Img1"/>

然后在 getimage.aspx 中

  sqlConnection.Open();     
  SqlCommand sqlCommand = new SqlCommand("Select Images"  ,sqlConnection);
  Reader= sqlCommand.ExecuteReader(CommandBehavior.CloseConnection); 
  byte [] byteArray
  if(Reader.Read())
  {
     byteArray= (byte[]) Reader["Images"];
  }

  System.IO.MemoryStream mstream = new System.IO.MemoryStream(byteArray,0,byteArray.Length);
  System.Drawing.Image dbImage = System.Drawing.Image.FromStream( new System.IO.MemoryStream(byteArray));
  System.Drawing.Image thumbnailImage = dbImage.GetThumbnailImage(100,100,null,new System.IntPtr());
   thumbnailImage.Save(mstream,dbImage.RawFormat);
   Byte[] thumbnailByteArray = new Byte[mstream.Length];
   mstream.Position = 0;
   mstream.Read(thumbnailByteArray, 0, Convert.ToInt32(mstream.Length));
   Response.Clear();
   Response.ContentType="image/jpeg";
   Response.BinaryWrite(thumbnailByteArray);

1
你可能想使用 .ashx 而不是 .aspx,因为你在这里不需要模板引擎,而且 .ashx 会稍微快一些。 :) - mihi
1
你的代码似乎做了一些微不足道的不同,并且缺少任何解释的痕迹。 - Alexei Levenkov
我认为这段代码完成了OP所要求的功能...尽管以这种方式图像无法正确缓存 - Darko Kenda
2
-1:这段代码可能能够工作,但是它没有任何解释,更糟糕的是,也没有使用 using 块。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接