我可以使用页面流式传输图像,而不是发送ImageUrl吗?

时间:2013-04-30 19:06:43

标签: c# asp.net image

我的图像存储在Sql Server数据库中,我想在网页上显示它们。

问题是,ASP.NET中的Image控件具有ImageUrl属性,该属性将路径的值作为包含图像文件的文件夹的值。但我从数据库表中绘制我的图像,并且不想将图像保存到磁盘,因此我可以提供路径。我宁愿将图像直接流式传输到页面。

我很难描绘这个(双关语意图),并怀疑这将要完成的唯一方法是将图像临时保存到某个位置,然后将其修改为图像控件。但也许我错过了什么?

编辑添加:

这是一个会计系统,需要提供差旅费用以便报销。我们正在考虑允许用户(我们有30,000个用户)扫描他们的收据并将其与他们的报销请求相关联地存储。我想,在文件系统中存储它是一种方法,它使用索引存储在Sql Server表中的文件系统。但是我被问到是否可以在Sql Server中完成,我可以做得很好,但显示/报告方面很重要。需要为这些报销请求生成报告,我不知道Crystal Reports与文件系统的兼容性如何。简而言之,在Sql Server中执行此操作会容易得多。

2 个答案:

答案 0 :(得分:2)

您是否考虑过使用数据URI?数据URI允许您将图像等数据直接嵌入到页面中。图像被编码为base 64,然后作为HTML中<img>元素的源包含在内。您可以阅读有关数据URI的更多信息here

this question and answer涵盖了如何在C#中执行此操作的详细信息。图像元素最终看起来像<img src="data:image/png;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrS"/>

对图像使用数据URI的主要问题是不支持旧版本的IE,或限制图像的大小。 Here是数据URI浏览器限制的文档。

答案 1 :(得分:-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);