将从数据库获取的二进制流显示为“图像”;在HTML中以标签
本文关键字:HTML 中以 标签 img 图像 获取 数据库 二进制 显示 | 更新日期: 2023-09-27 18:17:59
我试图显示从数据库作为二进制流获取的图像,在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());
谢谢
Base64编码您的二进制并插入图像标记如下(更改mime类型以适应):
<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE">
这是你会怎么做,但我不会这样做,因为一些浏览器不能处理它(IE6)。您最好先将其保存到一个文件中,然后按照常规方式进行。
我过去所做的是将图像url设置为aspx页面,如下所示:
<img src="getLogo.aspx" alt="Logo" />
然后,在getLogo的代码后面。在aspx中,我做了以下操作:
Response.BinaryWrite( imageData );
Response.ContentType = "image/gif";
其中imageData
是您的图像作为字节数组
我会将图像保存到网站内的一个目录,该目录可访问外部调用者(即图像子目录)使用一个无意义的名称(如数据库中记录的主键或GUID),然后在网页中添加一个href到此文件。
保存内存流到文件使用:
MemoryStream memoryStream = new MemoryStream();
using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write))
{
memoryStream.SaveTo(fileStream);
}
然后将filename放入html.
首先为图像创建一个单独的.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
,而不是写入内存中的一个大数组。对于小文件,差异是不重要的,但对于非常大的文件,它可能是相当大的(如在"哈,现在我的web服务器不再反复崩溃!"相当大)。