MVC提供运行时映像而不是将磁盘保存到浏览器

时间:2014-04-24 20:24:36

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

我的MVC应用程序在运行时创建图像,我不需要保存在磁盘上。

将这些内容发送到请求浏览器的最佳方法是什么? 请注意,图像永远不会相同,因此没有理由先将它们保存在磁盘上。

服务器将绘制随机图像并将图像返回给调用客户端。我试图了解这种操作的最佳格式是什么(位图,图像......),以便流回服务器尽可能顺畅和快速。

3 个答案:

答案 0 :(得分:1)

如果您可以获取位图的字节,那么很容易将其返回给客户端

public ActionResult GetImage()
{
    byte[] byteArray = MagicMethodToGetImageData();
    return new FileContentResult(byteArray, "image/jpeg");
}

此外,如果要返回图像加上一些数据,可以将字节编码为base64并将其包装为JSON,如下所示:

public ActionResult GetImage()
{
    byte[] byteArray = MagicMethodToGetImageData();
    var results = new 
    {
        Image = Convert.ToBase64String(byteArray),
        OtherData = "some data"
    };

    return Json(results);
}

答案 1 :(得分:1)

一种可能性是使用FileContentResult class来读取文件内容并直接显示或提供下载。解决方案可能如下所示:

private FileContentResult getFileContentResult(string name, bool download = true)
{
    if (!string.IsNullOrEmpty(name))
    {
        // don't forget to set the appropriate image MIME type 
        var result = new FileContentResult(System.IO.File.ReadAllBytes(name), "image/png");
        if (download)
        {
            result.FileDownloadName = Server.UrlEncode(name);
        }
        return result;
    }
    return null;
}

在某些 Action 中使用此方法,如下所示:

public ActionResult GetImage(string name)
{
    return getFileContentResult(name, true);
    // or use the image directly for example in a HTML img tag
    // return getFileContentResult(name);
}

这门课程相当健壮,速度很快 - 我在使用它时有很好的经验。

答案 2 :(得分:1)

如果您在创建它的同一页面中发送它们,则可以修改您的响应以直接发送它。

//After having your bitmap created...

MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.PNG);
bmp.Dispose();
byte[] data = ms.ToArray();
Response.ContentType = "image/png";
Response.ContentLength = data.Length;

using(var str = Response.GetResponseStream())
    str.Write(data, 0, data.Length);

Response.End();