将从数据库中获取的二进制流显示为html内的“image”作为<img/>标记

时间:2011-12-16 15:59:07

标签: c# asp.net webforms

我正在尝试在Web表单上显示从数据库中以二进制流的形式提取的图像。你能否对此有所了解!

我正在开展一个用户拥有个人资料的项目,每个用户都有自己的个人资料图片显示在主页中。这张照片来自数据库。

这是我用来获取流的代码!

TestDBDataContext context1 = new TestDBDataContext();

            var r = (from a in context1.ImageTables where a.Id == 8 select a).First();

           MemoryStream stream = new MemoryStream(r.FileImage.ToArray());

感谢

5 个答案:

答案 0 :(得分:8)

Base64对二进制文件进行编码并插入图像标记中,如下所示(更改mimetype以适应):

<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE">

这是你怎么做的,但我不会这样做,因为有些浏览器无法处理它(IE6)。最好先保存到文件并按常规方式执行。

答案 1 :(得分:4)

我过去所做的是将图片网址设置为aspx页面,如下所示:

<img src="getLogo.aspx" alt="Logo" />

然后,在getLogo.aspx的代码隐藏中,我完成了以下操作:

Response.BinaryWrite( imageData );
Response.ContentType = "image/gif";

其中imageData是您的图像作为字节数组

答案 2 :(得分:3)

我会使用无意义的名称(例如数据库中记录的主键或GUID)将图像保存到网站内可供外部调用者(即图像子目录)访问的目录中,然后添加href到网页中的这个文件。

答案 3 :(得分:1)

使用以下方式将内存流保存到文件:

MemoryStream memoryStream = new MemoryStream();
     using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write))
     {
       memoryStream.SaveTo(fileStream);
     }

然后将文件名放在html中。

答案 4 :(得分:1)

首先为图像添加一个单独的.aspx文件(实际上我很喜欢IHttpHandler重载,但原理相同,让我们一次只引入一个新概念)。

.aspx文件将继承代码隐藏,并且没有内容。所以它会有<%@ Page %>指令而没有别的。

在代码隐藏中,在页面加载事件处理程序中,获取图像,并将响应的内容类型设置为适当的值(或者,如果所有图像都是image / png,则可以硬编码)。然后将图像写入输出。

TestDBDataContext context1 = new TestDBDataContext();
int id;
if(int.TryParse(Request.QueryString["id"], out id))
{
  var r = (from a in context1.ImageTables where a.Id == 8 select a).FirstOrDefault();
  if(r != null)
  {
    Response.ContentType = r.ContentType;
    Response.BinaryWrite(r.FileImage.ToArray());
    return;
  }
}
//code to handle 404 not found for no such image here (send error message or Server.Transfer to error page, etc.

然后你可以将它用于<img src="profileImg.aspx?id=8" alt="" />等。

性能改进是从数据库一次获得4k块的字节并将其写入Response.OutputStream,而不是内存中的一个大型数组。对于小文件而言,差异并不重要,但是对于非常大的文件来说,这可能是相当大的(因为在#34;现在我的网络服务器不再屡屡重复!&#34;相当可观)。