MVC如何显示模型中的字节数组图像
我有一个模型,我想在页面上显示一个字节数组图像文件。
我怎样才能做到这一点,而不必回到数据库?
我看到的所有解决scheme使用ActionResult返回到数据库检索图像,但我已经在模型上的图像…
像这样的东西可能工作…
@{ var base64 = Convert.ToBase64String(Model.ByteArray); var imgSrc = String.Format("data:image/gif;base64,{0}", base64); } <img src="@imgSrc" />
正如在下面的评论中提到的,请使用上面的知识, 尽pipe这可能回答你的问题,但可能无法解决你的问题 。 根据您的问题,这可能是解决scheme,但我不会完全排除访问数据库两次。
这对我有效
<img src="data:image;base64,@System.Convert.ToBase64String(Model.CategoryPicture.Content)" width="80" height="80"/>
我推荐一些东西,即使图像存在于模型中。
我意识到你正在寻求一种直接的方式来从视图中访问它,许多其他人已经回答了这个问题,并告诉你这种方法有什么问题,所以这只是另一种方式,将以asynchronous的方式为你和我加载图像认为是一个更好的方法。
样品型号:
[Bind(Exclude = "ID")] public class Item { [Key] [ScaffoldColumn(false)] public int ID { get; set; } public String Name { get; set; } public byte[] InternalImage { get; set; } //Stored as byte array in the database. }
控制器中的示例方法:
public async Task<ActionResult> RenderImage(int id) { Item item = await db.Items.FindAsync(id); byte[] photoBack = item.InternalImage; return File(photoBack, "image/png"); }
视图
@model YourNameSpace.Models.Item @{ ViewBag.Title = "Details"; } <h2>Details</h2> <div> <h4>Item</h4> <hr /> <dl class="dl-horizontal"> <img src="@Url.Action("RenderImage", new { id = Model.ID})" /> </dl> <dl class="dl-horizontal"> <dt> @Html.DisplayNameFor(model => model.Name) </dt> <dd> @Html.DisplayFor(model => model.Name) </dd> </dl> </div>
一种方法是将其添加到新的C#类或HtmlExtensions类
public static class HtmlExtensions { public static MvcHtmlString Image(this HtmlHelper html, byte[] image) { var img = String.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(image)); return new MvcHtmlString("<img src='" + img + "' />"); } }
那么你可以在任何视图中做到这一点
@Html.Image(Model.ImgBytes)
如果你可以base-64编码你的字节,你可以尝试使用结果作为你的图像源。 在你的模型中,你可能会添加如下内容:
public string ImageSource { get { string mimeType = /* Get mime type somehow (eg "image/png") */; string base64 = Convert.ToBase64String(yourImageBytes); return string.Format("data:{0};base64,{1}", mimeType, base64); } }
在你看来:
<img ... src="@Model.ImageSource" />
如果图像不是那么大,而且很有可能你会经常重新使用图像,如果图像不是太多,而且图像不是秘密的(这意味着它不是很大处理一个用户是否可能看到另一个人的图像)…
很多“如果”在这里,所以这是一个很好的机会,这是一个坏主意:
您可以在短时间内将图像字节存储在Cache
中,并将图像标记指向一个操作方法,然后从caching中读取图像并吐出图像。 这将允许浏览器适当地caching图像。
// In your original controller action HttpContext.Cache.Add("image-" + model.Id, model.ImageBytes, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1), CacheItemPriority.Normal, null); // In your view: <img src="@Url.Action("GetImage", "MyControllerName", new{fooId = Model.Id})"> // In your controller: [OutputCache(VaryByParam = "fooId", Duration = 60)] public ActionResult GetImage(int fooId) { // Make sure you check for null as appropriate, re-pull from DB, etc. return File((byte[])HttpContext.Cache["image-" + fooId], "image/gif"); }
这在IE7(或IE8,如果大于32kB)内嵌图像不起作用的旧版浏览器中有额外的好处(或者是一个拐杖?)。
如果要呈现图像,请将方法添加为辅助类或模型本身,并允许该方法将字节数组图像转换为PNG或JPG等图像格式,然后转换为Base64string。 一旦你有了,以格式绑定视图上的base64值
“data:image / [图像文件types扩展名] ; base64, [你的base64string在这里] ”
以上分配给img
标签的src
属性。
我唯一的问题是base64string太长。 所以,我不会推荐它在视图中显示多个模型。
这是我在一个项目上使用的Manoj答案的修改版本。 刚刚更新了一个类,html属性和使用TagBuilder。
public static IHtmlString Image(this HtmlHelper helper, byte[] image, string imgclass, object htmlAttributes = null) { var builder = new TagBuilder("img"); builder.MergeAttribute("class", imgclass); builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); var imageString = image != null ? Convert.ToBase64String(image) : ""; var img = string.Format("data:image/jpg;base64,{0}", imageString); builder.MergeAttribute("src", img); return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing)); }
其中可以使用如下:
@Html.Image(Model.Image, "img-cls", new { width="200", height="200" })
我创build了一个基于下面的帮助器方法,我很高兴这个帮助器可以帮助尽可能多的帮助。
用一个模型:
public class Images { [Key] public int ImagesId { get; set; } [DisplayName("Image")] public Byte[] Pic1 { get; set; } }
帮手是:
public static IHtmlString GetBytes<TModel, TValue>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel, TValue>> expression, byte[] array, string Id) { TagBuilder tb = new TagBuilder("img"); tb.MergeAttribute("id", Id); var base64 = Convert.ToBase64String(array); var imgSrc = String.Format("data:image/gif;base64,{0}", base64); tb.MergeAttribute("src", imgSrc); return MvcHtmlString.Create(tb.ToString(TagRenderMode.SelfClosing)); }
该视图正在接收:ICollection对象,因此您需要在foreach语句的视图中使用它:
@foreach (var item in Model) @Html.GetBytes(itemP1 => item.Pic1, item.Graphics, "Idtag") }
你需要在你的数据库中有一个字节[]。
我的字节[]在我的Person对象中:
public class Person { public byte[] Image { get; set; } }
你需要在string中转换你的byte []。 所以,我有我的控制器:
String img = Convert.ToBase64String(person.Image);
接下来,在我的.cshtml文件中,我的Model是一个ViewModel。 这是我在:
public String Image { get; set; }
我在我的.cshtml文件中使用它:
<img src="@String.Format("data:image/jpg;base64,{0}", Model.Image)" />
“data:图像/ 图像文件扩展名 ; base64,{0}, 图像string ”
我希望它会帮助别人!
- ErrorMessageString或ErrorMessageResourceName必须设置,但不能同时使用CreditCardAttribute错误
- ASP.NET MVC的下拉列表中有一个默认的空选项
- 我想了解@ Html.DisplayFor(modelItem => item.FirstName)中的lambdaexpression式
- ASP.NET MVC 4 + Ninject MVC 3 =没有为此对象定义的无参数构造函数
- 如何使用C#关键字作为属性名称?
- ASP.NET MVC Ajaxerror handling
- EntityType'Category'没有定义键。 定义这个EntityType的关键
- 如何在ASP.NET 5 MVC 6(vNext)中定义Identity的密码规则?
- ASP.Net MVC如何将数据从视图传递到控制器