【问题标题】:How to return multiple images from controller method?如何从控制器方法返回多个图像?
【发布时间】:2013-01-28 10:46:57
【问题描述】:

我有一个生成图像的 ASP.NET MVC 控制器(它们存储在内存中,我不想将它们存储在硬盘上)并且应该将它们返回到我的视图中。

问题是:我不知道如何从一个控制器方法返回多个图像(我想在 1 个视图中显示图像)。我知道我可以使用 FileResult 返回单个图像,但我不知道(不是在 google/stackoverflow 上)如何从同一方法返回多个图像。无法将方法拆分为多个方法。哦,所有图像都转换为byte[],但如果需要,可以反转。

【问题讨论】:

  • 您的目标是从控制器操作中返回多个单独的图像?你不能......你可以将它们组合成一个图像......

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


【解决方案1】:

如果您有权访问图像的 MIME 类型,则始终可以将它们呈现为 Base64 编码的图像,而不是向不同的控制器方法发出另一个请求。这是我使用的视图模型:

public class ImageViewModel
{
    public string FileName { get; set; }

    public string MIME { get; set; }

    public byte[] Data { get; set; }

    public override string ToString()
    {
        return string.Format(@"data:{0};base64,{1}", MIME.ToLower(), Convert.ToBase64String(Data));
    }
}

您可以在<img /> 标记的alt 属性中使用Filename 属性,因此您的视图中的标记和模型绑定将如下所示(假设为Razor 语法):

<img src="@model.ToString()" alt="@model.FileName" />

你确实丢失了图像缓存,AFAIK - 这对我来说不是问题,但对某些人来说是可以理解的。

【讨论】:

    【解决方案2】:

    这应该可行。请注意,我正在从磁盘读取我的图像,但它们可以来自内存或任何地方。然后在客户端使用 java-script 显示它们。

    [HttpGet]
    public JsonResult Images()
    {
        var image1Base64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(Server.MapPath("~/Images/1.jpg")));
        var image2Base64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(Server.MapPath("~/Images/2.jpg")));
    
        var jsonResult = Json(new { image1 = image1Base64, image2 = image2Base64 }, JsonRequestBehavior.AllowGet);
        jsonResult.MaxJsonLength = int.MaxValue;
    
        return jsonResult;
    }
    

    【讨论】:

      【解决方案3】:

      我认为你可以用另一种方式解决它,而不是返回多个图像,你可以创建一个在控制器中加载图像的实用方法

      public FileContentResult GetImage(int imageId)
      {
        var image = GetImageById(imageId); // get from a list for example
        return File(image, "image/jpeg"); // your image Mime type
      }
      

      View 中,您可以执行以下操作,遍历图像

      @foreach (var image in Model)
      { 
      <img alt="" src="@Url.Action("GetImage", "ControllerName", new {imageId =image.Id})"/>
      }
      

      【讨论】:

        【解决方案4】:

        您希望根据用户的输入显示多个图像,但不想保存到硬盘(聊天)。因此,我建议您使用会话变量来保存用户输入。并使用简单的FileResult 根据该会话变量返回多个图像。

        http://blog.theobjectguy.com/2009/12/session-with-style.html

        【讨论】:

        • 既然有更简洁的方法,为什么还要使用会话?
        • 因为他不想显式写入文件夹,他必须返回多个图像(也就是多个 http 调用),并且他会根据用户的输入图像生成这些图像。
        【解决方案5】:

        如果您的要求是在一个视图中显示多个图像,则使用 2 种操作方法会更容易。一个返回带有 FileResult 的图像,另一个返回您只需使用标准 html img 标签指向第一个操作方法

        【讨论】:

        • 或者接受参数的“工厂”,根据参数从同一个动作返回不同的图像..
        猜你喜欢
        • 2014-01-26
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 2017-05-26
        相关资源
        最近更新 更多