C# 正在渲染视图中已存在的图像字节数据
我是MVC(来自面向对象的C#exe应用)和Stackoverflow的新手。我一直在努力使用MVC高效地运行代码。我有从数据库返回的模型数据,以及一个字节字段,它是一个jpeg图像。在这个阶段,我给数据库打了一个电话 现在我坚持的是,一旦填充的模型数据出现在要渲染的视图中,我就不能简单地循环它并渲染每个数据行中的图像。我发现唯一可以让它工作的方法是调用并操作返回FileContentResult的方法,但这需要为每个新图像重新调用数据库 对于解决方案,我尝试了三种不同的方法,解决了以下问题:C# 正在渲染视图中已存在的图像字节数据,c#,asp.net-mvc,image-rendering,C#,Asp.net Mvc,Image Rendering,我是MVC(来自面向对象的C#exe应用)和Stackoverflow的新手。我一直在努力使用MVC高效地运行代码。我有从数据库返回的模型数据,以及一个字节字段,它是一个jpeg图像。在这个阶段,我给数据库打了一个电话 现在我坚持的是,一旦填充的模型数据出现在要渲染的视图中,我就不能简单地循环它并渲染每个数据行中的图像。我发现唯一可以让它工作的方法是调用并操作返回FileContentResult的方法,但这需要为每个新图像重新调用数据库 对于解决方案,我尝试了三种不同的方法,解决了以下问题:
<img src=" @{Html.RenderAction("RenderMemberImage", "Home", new { @pic = x.ThumbnailData });}" />
[HttpGet]
public FileContentResult RenderMemberImage(byte[] pic)
{
return new FileContentResult(pic, "mime/jpeg");
}
[HttpGet]
公共文件内容结果RenderMemberImage(字节[]pic)
{
返回新的FileContentResult(pic,“mime/jpeg”);
}
问题是您试图从浏览器向服务器发送字节数组。试着这样做:
(我还没有编译,但应该很接近)
[HttpGet]
公共文件内容结果RenderMemberImage(Guid picId)
{
var pic=new Models.Picture(picId);//或者从数据库中获取数据的方式
返回新的FileContentResult(pic.ThumbnailData,“mime/jpeg”);
}
基本上,对于页面上的每个图像,浏览器都会向服务器发出获取图像的请求。一个可能的解决方案是将字节转换为Base64表示,并将其作为子对象的属性
public class Child
{
public string ImageURL { set;get;}
//other properties & construct etc
}
public class Master
{
IEnumerable<Child> Children { set;get;}
}
您可以在这样的视图中使用它
@foreach(child in Model.Children)
{
<img src="child.ImageURL" alt="loding.." />
}
@foreach(Model.Children中的子对象)
{
}
谢谢你,但我认为你没有阅读我的全部帖子。我不想用字节数据返回服务器。我已经有了客户端上的字节数据。我想在客户端使用它。我试图找到一种不必返回数据库和web服务器的方法,但最好是,我根本不想返回服务器。这有意义吗?事实上,我确实读了你的全部文章,据我所知,除了数据URI方法之外,浏览器不支持你尝试工作的场景。您可能知道,图像标记的src
属性通常会链接回服务器上的路由,该路由在HttpResponse中返回图像。如果你不想设置你的应用程序来实现这一点,你就要逆流而上,试图让它在多个浏览器上工作。谢谢。就像我在上面回答Shyju关于数据URI的问题一样,听起来我想做的事情在web世界中还没有准备好,我需要做的不是将图像存储在数据库中,而是从文件/应用程序服务器以标准http地址提供它们。你怎么看?我假设你有一个很好的理由将图像放入数据库(即,通过不同的控制器/操作很容易更新?),所以这没有问题。如果图像是静态的,并且仅在web应用程序更新时才会更改,那么出于效率考虑,我不会将它们存储在数据库中(IIS从文件系统返回图像与web应用程序/数据库相比,效果更好)。如果您确实想将它们存储在数据库中,那么您可以使用我上面的建议来执行此操作(即,图像由控制器作为“视图”结果返回)。这不是一个故意的原因,只是我必须操作字节数据来调整图像的大小,因此很容易在数据库中保留字段。。。除此之外,我一直乐于接受关于如何存储和检索它的建议。我不是一个经验丰富的web开发人员,我甚至已经有一段时间没有编写过许多桌面应用程序了,所以这就像往常一样是一个学习曲线。谢谢大家。是的,这大概就是我对上面提到的问题3所做的。我认为数据URI在未来会被更多地使用,但现在IE已经落后于“时代”。听起来我需要做的不是将图像存储在数据库中,而是从文件/应用服务器以标准http地址提供它们。你们觉得怎么样?谢谢你的反馈。
public ActionResult SomeGetACtion()
{
var master=new Master();
foreach(itm in someCollection)
{
var child=new Child();
byte[] imageData = GetImageByte(); //get your byte data;
string imageBase64 = Convert.ToBase64String(imageData);
child.ImageURL = string.Format("data:image/gif;base64,{0}", imageBase64);
master.Children.Add(byte);
}
}
@foreach(child in Model.Children)
{
<img src="child.ImageURL" alt="loding.." />
}