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

C# 如何从控制器方法返回多个图像?,c#,asp.net-mvc,image-processing,C#,Asp.net Mvc,Image Processing,我有一个ASP.NET MVC控制器,可以生成图像(它们存储在内存中,我不想将它们存储在硬盘上),并应将它们返回到我的视图 问题是:我不知道如何从一个控制器方法返回多个图像(我想在一个视图中显示图像)。例如,我知道我可以使用FileResult返回一个图像,但我不知道(不在google/stackoverflow上)如何从同一方法返回多个图像。无法将该方法拆分为多个方法。哦,所有图像都转换为字节[],但如果需要,可以反转。如果您的要求是在一个视图中显示多个图像,则使用两种操作方法会更容易。一个是

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


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

如果您的要求是在一个视图中显示多个图像,则使用两种操作方法会更容易。一个是返回带有FileResult的图像,另一个是使用标准html img标记指向第一个操作方法,我认为您可以用另一种方法解决它,而不是返回多个图像,您可以创建一个实用方法,在控制器中加载图像

public FileContentResult GetImage(int imageId)
{
  var image = GetImageById(imageId); // get from a list for example
  return File(image, "image/jpeg"); // your image Mime type
}
视图中
可以执行以下操作,迭代图像

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

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


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

[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;
}

如果您有权访问图像的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));
    }
}
您可以在
alt
属性中使用
Filename
属性

AFAIK,您确实丢失了图像缓存-这对我来说不是问题,但对某些人来说是可以理解的破坏交易的因素。

您的目标是从控制器操作返回多个单独的图像?你不能。。您可以将它们组合成一个映像..或者一个“工厂”,它接受一个参数,该参数根据该参数从同一操作返回不同的映像..当有更干净的方法执行此操作时,为什么要使用会话?因为他不想显式地写入文件夹,并且必须返回多个映像(也称为多个http调用),他根据用户的输入图像生成这些图像。
<img src="@model.ToString()" alt="@model.FileName" />