Nmk*_*nas 5 .net c# asp.net-mvc-4
我正在编写一个ASP.NET MVC4应用程序,它将上传的图像存储byte[]在数据库中(使用Entity框架),然后显示它们.要在视图中显示我正在使用此代码的图像:
<img src="data:image;base64,@System.Convert.ToBase64String(item.ImageByte)" alt=""/>
Run Code Online (Sandbox Code Playgroud)
但每次刷新页面时,我都会看到浏览器没有缓存图像,只是再次渲染它会导致无用的带宽使用.
也许有更多带宽更友好的方式来显示图像?也许将上传的图像存储为'byte []'的想法首先是愚蠢的(我的应用程序只是一个简单的网页,存储有关心理学的文章:D与管理面板来实现这一点)我应该只存储图像一个文件夹?
谢谢
将图像存储在数据库中是一种可能的选择.有时候这是一个好主意,有时候是一个坏主意.通常,如果处理大量或大尺寸图像,建议您使用不同的存储方法重新考虑.
实际上,您目前正在做的是将图像嵌入HTML中; 这可能是好的我之前使用它需要大约5秒来计算图表的数据并且页面需要相同的数据,但在一般情况下,你最好从动作中提供图像.
所以我们需要做的是在控制器中提供一个动作来获取图像; 可能基于id - 但我会留给你.
[OutputCache(Duration = 3600, VaryByParam = "id")]
public ActionResult GetImage(int Id)
{
// 1. provide connection to entity framework
var dbc = new DatabaseContext();
var item = dbc.FindItem(Id);// call to get the image from EF (2)
var ms = new MemoryStream(tem.ImageByte);
FileStreamResult result = new FileStreamResult(ms, "image/png");
result.FileDownloadName = item.ImageName; // or item.Id or something (3)
return result;
}
Run Code Online (Sandbox Code Playgroud)
在cshtml中
<img src="@Url.Action("GetImage", "Controller", new {Id = Model.ImageId})" />
Run Code Online (Sandbox Code Playgroud)
所以在上面的代码中你需要提供
在你HomeController添加一个像这样的函数:
[HttpGet]
public FileResult GetImage(string id)
{
byte[] fileContents = ...; // load from database or file system
string contentType = "image/jpeg";
return File(fileContents, contentType);
}
Run Code Online (Sandbox Code Playgroud)
在以下位置注册此处理程序的路由Global.asax.cs:
routes.MapRoute(
"GetImage",
"img/{id}",
new { controller = "Home", action = "GetImage" });
Run Code Online (Sandbox Code Playgroud)
在您的网页中,使用src指向此操作的指向:
<img src="@Url.Action("GetImage", "Home", new { id = "logo.jpg" })" />
Run Code Online (Sandbox Code Playgroud)
这将解决
<img src="/img/logo.jpg" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3385 次 |
| 最近记录: |