如何从控制器方法返回多个图像?

时间:2013-02-13 00:07:39

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

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

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

5 个答案:

答案 0 :(得分: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})"/>
}

答案 1 :(得分:3)

如果您可以访问图像的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));
    }
}

您可以使用Filename标记的alt属性中的<img />属性,以便标记&amp;视图中的模型绑定看起来像这样(假设Razor语法):

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

你确实失去了图像缓存,AFAIK--对我来说这不是一个问题,但对某些人来说这是一个可以理解的交易障碍。

答案 2 :(得分: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 :(得分:1)

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

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

答案 4 :(得分:0)

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