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的发布版本,我做了以下工作:
[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。 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