我可以创建一个仅返回图像资产的控制器吗?
每当请求以下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。 :-)
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3161516