3

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

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

4

5 回答 5

4

这应该有效。请注意,我正在从磁盘读取我的图像,但它们可以来自内存或任何地方。然后在客户端使用 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;
}
于 2013-02-13T00:31:45.213 回答
4

如果您有权访问图像的 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,因此您的视图中的标记和模型绑定看起来像这样(假设 Razor 语法):alt<img />

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

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

于 2013-02-13T00:32:02.643 回答
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})"/>
}
于 2013-02-13T00:19:17.820 回答
1

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

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

于 2013-02-13T00:22:05.173 回答
0

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

于 2013-02-13T00:15:06.657 回答