【问题标题】:Rendering image Byte data already in the view渲染视图中已经存在的图像字节数据
【发布时间】:2012-07-07 01:28:46
【问题描述】:

我是 MVC(来自面向对象的 C# exe 应用程序)和 Stackoverflow 的新手。我一直在努力尝试使用 MVC 有效地运行代码。我有从数据库返回的模型数据,以及该数据是一个字节字段,它是一个 jpeg 图像。在这个阶段,我已经对数据库进行了一次调用......

现在我坚持的是,一旦填充的模型数据在要渲染的视图中,我不能简单地循环它并在每个数据行中渲染图像。我发现使它工作的唯一方法是调用返回 FileContentResult 的 Action 方法,但这需要为每个图像重新调用回数据库。

对于解决方案,我尝试了三种不同的方法来解决以下问题:

  1. 我似乎无法通过 Action 方法将字节数组传回控制器 满足 MVC 希望如何在 看法。 Action 方法只想接受简单类型。
  2. 我显然不想让控制器返回数据库获取字节 我已经在视图中拥有的数据,尤其是当这将 我的模型数据中的每个条目都涉及多次往返。
  3. 使用 Data Uri 有效,但尚无足够多的浏览器支持。

谁能告诉我处理此类问题的最佳方法是什么?我是否需要处理问题 1 或 2,或者是否有我遗漏的其他方法?

这是我最初在问题 1 中尝试使用的代码,用于将字节数组传回控制器,以便渲染 FileContentResult:

<img src=" @{Html.RenderAction("RenderMemberImage", "Home", new { @pic = x.ThumbnailData });}" />

[HttpGet]
    public FileContentResult RenderMemberImage(byte[] pic)
    {
        return new FileContentResult(pic, "mime/jpeg");
    }

【问题讨论】:

    标签: c# asp.net-mvc image-rendering


    【解决方案1】:

    一种可能的解决方案是将字节转换为 Base64 表示并将其保留为子对象的属性

    public class Child
    {
      public string ImageURL { set;get;}
      //other properties & construct etc 
    }
    public class Master
    {
      IEnumerable<Child> Children { set;get;}
    }
    

    在您的 GET 操作中

    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.." />
    
    }
    

    【讨论】:

    • 是的,这大致就是我对上面提到的问题 3 所做的。我想未来会更多地使用数据 URI,但现在 IE 已经落后于“时代”。听起来我需要做的只是不将图像存储在数据库中,而是从标准 http 地址的文件/应用程序服务器提供它们。你们有什么感想?感谢您的反馈。
    【解决方案2】:

    问题是您试图从浏览器向服务器发送一个字节数组。试试这样的:

    (我没有编译这个,但应该很接近)

    <img src=" @{Html.Action("RenderMemberImage", "Home", new { @picId = x.Id });}" />
    
    [HttpGet]
    public FileContentResult RenderMemberImage(Guid picId)
    {
        var pic = new Models.Picture(picId);//or however you get your data out of the DB
        return new FileContentResult(pic.ThumbnailData , "mime/jpeg");
    }
    

    基本上,对于页面上的每个图像,浏览器都会向服务器发出请求以获取图像。

    【讨论】:

    • 谢谢,但我认为您没有阅读我的整篇文章。我不想带着字节数据回到服务器。我已经在客户端上有字节数据。我想在客户端使用它。我正在尝试找到一种方法,我不必返回数据库和 Web 服务器,但最好是,我根本不想返回服务器。这有意义吗?
    • 实际上,我确实阅读了您的整篇文章,据我所知,除了 Data URI 方法之外,浏览器不支持您尝试制作的场景。您可能知道通常图像标记的src 属性将链接回服务器上的路由,该路由在 HttpResponse 中返回图像。如果您不想设置您的应用程序来执行此操作,您将在上游尝试使其在多个浏览器上工作。
    • 谢谢。就像我在上面回复 Shyju 关于数据 URI 一样,听起来我想做的事情还没有在网络世界中准备好,我需要做的不是将图像存储在数据库中,而是从文件/应用程序服务器提供它们标准的http地址。你怎么看?
    • 我假设您有充分的理由将图像放入数据库中(即通过不同的控制器/操作轻松更新?)所以没有问题。如果图像是静态的并且仅在更新 Web 应用程序时更改,那么出于效率原因,我不会将它们存储在数据库中(IIS 从文件系统返回图像与 Web 应用程序/数据库相比的影响较小) .如果您确实想将它们存储在数据库中,那么您可以使用我上面的建议来执行此操作(即,控制器将图像作为“视图”结果返回)。
    • 除了我不得不操纵字节数据来调整图像的大小之外,这并不是一个故意的原因,所以很容易在数据库中的一个字段中粘贴......除此之外,我有对如何存储和检索它的建议持开放态度。我不是一个经验丰富的 Web 开发人员,而且我已经有一段时间没有编写许多桌面应用程序了,所以和往常一样,这是一个学习曲线。谢谢大家。
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多