Thursday 18 November 2010

Show an image saved in a SQL Table on an ASP.Net Image Control

In a previous entry I have shown, how to store images to a database table. Now I will show you how to retrieve it and show it on a ASP.Net Image control. There is no straight forward method showing it like “ImageControl.Image = ImageStream….” How ever it can be achieved using a Generic Handler.

Add a ‘Generic Handler’ to your ASP.Net web application. And in this example I will name it as ‘getImageFromDB.ashx’. By default IHttpHandler will be implemented. (ProcessRequest and IsReusable methods will be implemented). And I will add another method called ‘GetImage’ and alter the ‘ProcessRequest’ method. And the finished handler should similar to this:

   1: using System;
   2: using System.Drawing;
   3: using System.Drawing.Imaging;
   4: using System.IO;
   5: using System.Web;
   6: using System.Data;
   7: using System.Data.SqlClient;
   8:  
   9: namespace MyWebApplication
  10: {
  11:    
  12:     public class getImageFromDB : IHttpHandler
  13:     {
  14:         public void ProcessRequest(HttpContext context)
  15:         {
  16:             context.Response.Clear();
  17:  
  18:             if (!String.IsNullOrEmpty(context.Request.QueryString["empID"]))
  19:             {
  20:                 int id = Int32.Parse(context.Request.QueryString["empID"]);
  21:  
  22:                 Image image = GetImage(id);
  23:  
  24:                 context.Response.ContentType = "image/jpeg";
  25:                 image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
  26:             }
  27:             else
  28:             {
  29:                 context.Response.ContentType = "text/html";
  30:                 context.Response.Write("<p>Need a valid id</p>");
  31:             }
  32:         }
  33:  
  34:         public bool IsReusable
  35:         {
  36:             get
  37:             {
  38:                 return false;
  39:             }
  40:         }
  41:  
  42:         private Image GetImage(int empID)
  43:         {
  44:  
  45:             MemoryStream memoryStream = new MemoryStream();
  46:             //Retrieve image from Database to a memeory stream. If you are using a different method, use it and assign the data to the 'memoryStream' variable.
  47:  
  48:             string connectionString = "Password=PWD;Persist Security Info=True;User ID=USER;Initial Catalog=SampleDatabase;Data Source=SQLSERVER";
  49:             using (SqlConnection sqlConnection = new SqlConnection(connectionString))
  50:             {
  51:                 using (SqlCommand sqlCommand = new SqlCommand("SELECT emp_id, emp_name, emp_image FROM Employee where emp_id = " + empID.ToString(), sqlConnection))
  52:                 {
  53:                     sqlConnection.Open();
  54:                     SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
  55:  
  56:                     if (sqlDataReader.HasRows)
  57:                     {
  58:                         sqlDataReader.Read();
  59:                         byte[] btImage = (byte[])sqlDataReader["emp_image"];
  60:  
  61:                         memoryStream = new MemoryStream(btImage, false);
  62:                     }
  63:                 }
  64:                 sqlConnection.Close();
  65:             }
  66:             return Image.FromStream(memoryStream);
  67:         }
  68:     }
  69: }

And you can call the handler and display the image, using the following syntax :



   1: private void GetImageFromDatabase(int empID)
   2: {
   3:     imageControl.ImageUrl = "getImageFromDB.ashx?empID=" + empID.ToString();
   4: }

6 comments: