ASP.NET MVC控制器可以返回图像吗?

时间秒杀一切 提交于 2020-02-28 03:31:12

我可以创建一个仅返回图像资产的控制器吗?

每当请求以下URL时,我都希望通过控制器路由此逻辑:

www.mywebsite.com/resource/image/topbanner

控制器将查找topbanner.png并将该图像直接发送回客户端。

我看过这样的示例,其中您必须创建一个View-我不想使用View。 我想只用Controller来完成所有操作。

这可能吗?


#1楼

使用基本控制器的File方法。

public ActionResult Image(string id)
{
    var dir = Server.MapPath("/Images");
    var path = Path.Combine(dir, id + ".jpg"); //validate the path for security or use other means to generate the path.
    return base.File(path, "image/jpeg");
}

需要注意的是,这似乎相当有效。 我做了一个测试,通过控制器( http://localhost/MyController/Image/MyImage )和直接URL( http://localhost/Images/MyImage.jpg )请求图像,结果是:

  • MVC:每张照片7.6毫秒
  • 直接:每张照片6.7毫秒

注意:这是请求的平均时间。 平均值是通过在本地计算机上发出数千个请求来计算的,因此总数不应包含网络延迟或带宽问题。


#2楼

为了稍微解释Dyland的反应:

三个类实现FileResult类:

System.Web.Mvc.FileResult
      System.Web.Mvc.FileContentResult
      System.Web.Mvc.FilePathResult
      System.Web.Mvc.FileStreamResult

它们都是很自我解释的:

  • 对于磁盘上存在文件的文件路径下载,请使用FilePathResult这是最简单的方法,可以避免使用Streams。
  • 对于byte []数组(类似于Response.BinaryWrite),请使用FileContentResult
  • 对于要在其中下载文件的byte []数组(内容处置:附件),请按以下类似方式使用FileStreamResult ,但要使用MemoryStream并使用GetBuffer()
  • 对于Streams使用FileStreamResult 。 它被称为FileStreamResult,但它需要一个Stream所以我它可以与MemoryStream

下面是使用内容处理技术的示例(未经测试):

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult GetFile()
    {
        // No need to dispose the stream, MVC does it for you
        string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "myimage.png");
        FileStream stream = new FileStream(path, FileMode.Open);
        FileStreamResult result = new FileStreamResult(stream, "image/png");
        result.FileDownloadName = "image.png";
        return result;
    }

#3楼

我看到两个选择:

1)实现自己的IViewEngine,并以所需的“图像”方法将要使用的Controller的ViewEngine属性设置为ImageViewEngine。

2)使用视图:-)。 只需更改内容类型等。


#4楼

看一下ContentResult。 这将返回一个字符串,但可用于创建自己的类似于BinaryResult的类。


#5楼

您可以使用HttpContext.Response并将内容直接写入其中(WriteFile()可能对您有用),然后从您的操作而不是ActionResult返回ContentResult。

免责声明:我没有尝试过,它基于查看可用的API。 :-)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!