Introduction
In this post, I am explain How to Display image from database using Generic Handler in ASP.Net MVC4 application.In my previous Article I have expainted How to upload image to database and show in a Page without image handler in MVC4. Here I would like to explain How to Display image from database using Generic Handler in ASP.Net MVC4 application.
The previous Article How to upload image to database and show in a Page without image handler in MVC4. , is good because it Removes separate HTTP Requests for loading image from database and is suitable when used for very few images. But there is some limitation as well
- Its increase image size approximately 20-25%.
- If you put the base64 image directly in a page, it won't be cached separately.
Steps :
Step - 1 : Create New Project.
Go to File > New > Project > Select asp.net MVC4 web application > Entry Application Name > Click OK > Select Internet Application > Select view engine Razor > OKStep-2: Add a Database.
Go to Solution Explorer > Right Click on App_Data folder > Add > New item > Select SQL Server Database Under Data > Enter Database name > Add.Step-3: Create table for Store Images.
Open Database > Right Click on Table > Add New Table > Add Columns > Save > Enter table name > Ok.Step-4: Add Entity Data Model.
Go to Solution Explorer > Right Click on Project name form Solution Explorer > Add > New item > Select ADO.net Entity Data Model under data > Enter model name > Add.A popup window will come (Entity Data Model Wizard) > Select Generate from database > Next >
Chose your data connection > select your database > next > Select tables > enter Model Namespace > Finish.
Step-5: Add a Generic handler for Fetch Image from Database and return image content to the response stream.
Right Click on Solution Explorer > Add > New Item > Select Generic Handler under web > Enter name > Add.Here We will pass the Id parameter as a querystring parameter to our handler and then we will fetch image data from database based on id value . After that, we will write the image content to the response stream using the BinaryWrite method. To display the image, we will use <img src="~/ourGenericHandler.ashx?id=1"/>
Write following code to the handler
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcImageHandler
{
public class MyImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "Image/png";
var param = context.Request.QueryString["id"];
int id = 0;
if (param != null && int.TryParse(param, out id))
{
byte[] image = null;
using (MyDatabaseEntities dc = new MyDatabaseEntities())
{
image = dc.MyImages.Where(a => a.Id.Equals(id)).FirstOrDefault().ImageData;
}
//Cache
TimeSpan cacheTime = new TimeSpan(1, 0, 0);
context.Response.Cache.VaryByParams["*"] = true;
context.Response.Cache.SetExpires(DateTime.Now.Add(cacheTime));
context.Response.Cache.SetMaxAge(cacheTime);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BinaryWrite(image);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Step-6: Add a new Controller.
Go to Solution Explorer > Right Click on Controllers folder form Solution Explorer > Add > Controller > Enter Controller name > Select Templete "empty MVC Controller"> Add.Step-7: Add new action into your controller for show Image in view.
Here I have added "List" Action into our Controller. Please write this following code public ActionResult List()
{
List<MyImage> all = new List<MyImage>();
//MyDatabaseEntities is our datacontext
using (MyDatabaseEntities dc = new MyDatabaseEntities())
{
all = dc.MyImages.ToList();
}
return View(all);
}
Step-8: Add view for the Action & design.
Right Click on Action Method (here right click on form action) > Add View... > Enter View Name > Select View Engine (Razor) > Check "Create a strong-typed view" > Select your model class > Add.[N:B:Please Rebuild solution before add view.]
Complete View
@model IEnumerable<MvcImageHandler.MyImage>
@{
ViewBag.Title = "List";
}
<h2>List</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.FileName)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FileName)
</td>
<td>
<img src="~/MyGenericHandler.ashx?id=@item.Id" />
</td>
</tr>
}
</table>
Step-9: Run Application.
- How to upload image to database and show in a Page without image handler in MVC4.
- How to insert image into database and display in Gidview without Image Handler.