Mega Code Archive

 
Categories / ASP.Net Tutorial / Development
 

Implementing the IHttpHandler Interface

File: App_Code\ImageHandler.cs using System; using System.Web; using System.Data; using System.Data.SqlClient; using System.Web.Configuration; namespace MyNamespace {     public class ImageHandler : IHttpHandler     {         const string connectionStringName = "Images";         public void ProcessRequest(HttpContext context)         {             context.Response.Buffer = false;             string fileName = VirtualPathUtility.GetFileName(context.Request.Path);             string conString = WebConfigurationManager.ConnectionStrings [connectionStringName].ConnectionString;             SqlConnection con = new SqlConnection(conString);             SqlCommand cmd = new SqlCommand("SELECT Image FROM Images WHERE FileName=@FileName", con);             cmd.Parameters.AddWithValue("@fileName", fileName);             using (con)             {                 con.Open();                 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior. SequentialAccess);                 if (reader.Read())                 {                     int bufferSize = 8040;                     byte[] chunk = new byte[bufferSize];                     long retCount;                     long startIndex = 0;                     retCount = reader.GetBytes(0, startIndex, chunk, 0, bufferSize);                     while (retCount == bufferSize)                     {                         context.Response.BinaryWrite(chunk);                         startIndex += bufferSize;                         retCount = reader.GetBytes(0, startIndex, chunk, 0, bufferSize);                     }                     byte[] actualChunk = new Byte[retCount - 1];                     Buffer.BlockCopy(chunk, 0, actualChunk, 0, (int)retCount - 1);                     context.Response.BinaryWrite(actualChunk);                 }             }         }         public bool IsReusable         {             get { return true; }         }     } }              Register the class in the web configuration file.  File: Web.Config <configuration>   <connectionStrings>     <add name="Images"       connectionString="Data Source=.\SQLExpress;Integrated            Security=True;AttachDBFileName=|DataDirectory|ImagesDB.mdf;            User Instance=True"/>   </connectionStrings>     <system.web>       <httpHandlers>         <add path="*.gif" verb="*"            type="MyNamespace.ImageHandler" validate="false" />         <add path="*.jpeg" verb="*"            type="MyNamespace.ImageHandler" validate="false" />         <add path="*.jpg" verb="*"            type="MyNamespace.ImageHandler" validate="false" />       </httpHandlers>     </system.web> </configuration> Displaying images with the ImageHandler. <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server">     protected void btnAdd_Click(object sender, EventArgs e)     {         if (upFile.HasFile)         {                 srcImages.Insert();         }     } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">     <title>Image Upload</title> </head> <body>     <form id="form1" runat="server">     <div>     <asp:Label         id="lblFile"         Text="Image File:"         AssociatedControlID="upFile"         Runat="server" />     <asp:FileUpload         id="upFile"         Runat="server" />     <asp:Button         id="btnAdd"         Text="Add Image"         OnClick="btnAdd_Click"         Runat="server" />     <hr />     <asp:GridView         id="grdImages"                 DataSourceID="srcImages"         AutoGenerateColumns="false"         ShowHeader="false"         GridLines="None"         Runat="server">         <Columns>         <asp:ImageField             DataImageUrlField="FileName"             DataAlternateTextField="FileName" />         </Columns>     </asp:GridView>     <asp:SqlDataSource         id="srcImages"         ConnectionString="<%$ ConnectionStrings:Images %>"         SelectCommand="SELECT FileName FROM Images"         InsertCommand="INSERT Images (FileName,Image) VALUES (@FileName,@FileBytes)"         Runat="server">         <InsertParameters>             <asp:ControlParameter Name="FileName" ControlID="upFile" PropertyName="FileName" />             <asp:ControlParameter Name="FileBytes" ControlID="upFile" PropertyName="FileBytes" />         </InsertParameters>     </asp:SqlDataSource>     </div>     </form> </body> </html>