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

我可以创建一个简单地返回图像资源的控制器吗?

我希望通过一个控制器路由这个逻辑,每当需要如下的URL时:

www.mywebsite.com/resource/image/topbanner

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

我已经看到了这个例子,你必须创建一个视图 - 我不想使用视图。 我只想用Controller来完成这一切。

这可能吗?


使用基本控制器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毫秒
  • 注意:这是请求的平均时间。 通过在本地计算机上发出数千个请求来计算平均值,因此总计不应包含网络延迟或带宽问题。


    使用MVC的发布版本,我做了以下工作:

    [AcceptVerbs(HttpVerbs.Get)]
    [OutputCache(CacheProfile = "CustomerImages")]
    public FileResult Show(int customerId, string imageName)
    {
        var path = string.Concat(ConfigData.ImagesDirectory, customerId, "", imageName);
        return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg");
    }
    

    我显然在这里有一些关于路径构造的应用程序特定的东西,但FileStreamResult的返回很好很简单。

    我对这个动作进行了一些性能测试,针对您对图像的每日调用(绕过控制器),平均值之间的差异仅为3毫秒(控制器平均值为68毫秒,非控制器为65毫秒)。

    我尝试了一些在这里回答中提到的其他方法,并且性能受到更大的影响......其中几个解决方案响应高达非控制器的6倍(其他控制器avg 340ms,非控制器65ms)。


    稍作解释Dyland的回应:

    三个类实现FileResult类:

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

    他们都相当自我解释:

  • 对于文件存在于磁盘上的文件路径下载,请使用FilePathResult - 这是最简单的方法,并避免您必须使用Streams。
  • 对于byte []数组(类似于Response.BinaryWrite),使用FileContentResult
  • 对于要下载文件的字节[]数组(内容处置:附件),请使用类似于以下方法的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;
        }
    
    链接地址: http://www.djcxy.com/p/8421.html

    上一篇: Can an ASP.NET MVC controller return an Image?

    下一篇: When to use double or single quotes in JavaScript?